@tailor-platform/erp-kit 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +3 -26
- package/dist/cli.mjs +1613 -0
- package/package.json +14 -13
- package/schemas/app-compose/business-flow.yml +3 -0
- package/schemas/app-compose/story.yml +13 -1
- package/schemas/module/command.yml +9 -0
- package/schemas/module/module.yml +4 -0
- package/schemas/module/query.yml +9 -0
- package/skills/erp-kit-app-1-requirements/SKILL.md +8 -14
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +102 -0
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +66 -0
- package/skills/erp-kit-app-2-requirements-review/references/boundary-consistency-check.md +69 -0
- package/skills/erp-kit-app-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-app-3-plan/SKILL.md +157 -0
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +107 -0
- package/skills/erp-kit-app-3-plan/references/screen-extraction.md +74 -0
- package/skills/erp-kit-app-3-plan/references/story-extraction.md +86 -0
- package/skills/erp-kit-app-4-plan-review/SKILL.md +177 -0
- package/skills/erp-kit-app-4-plan-review/references/actor-flow-parity.md +73 -0
- package/skills/erp-kit-app-4-plan-review/references/business-flow-story-parity.md +86 -0
- package/skills/erp-kit-app-4-plan-review/references/orphan-detection.md +69 -0
- package/skills/erp-kit-app-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-app-4-plan-review/references/story-resolver-parity.md +83 -0
- package/skills/erp-kit-app-4-plan-review/references/story-screen-parity.md +73 -0
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +105 -0
- package/skills/erp-kit-app-5-impl-backend/references/app-config.md +38 -0
- package/skills/erp-kit-app-5-impl-backend/references/module-wiring.md +48 -0
- package/skills/erp-kit-app-5-impl-backend/references/resolver-patterns.md +68 -0
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +74 -0
- package/skills/erp-kit-app-6-impl-frontend/references/pages.md +160 -0
- package/skills/erp-kit-app-7-impl-review/SKILL.md +176 -0
- package/skills/erp-kit-app-7-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-app-7-impl-review/references/module-wiring-parity.md +84 -0
- package/skills/erp-kit-app-7-impl-review/references/resolver-doc-code-parity.md +86 -0
- package/skills/erp-kit-app-7-impl-review/references/screen-doc-code-parity.md +86 -0
- package/skills/erp-kit-module-1-requirements/SKILL.md +126 -0
- package/skills/erp-kit-module-1-requirements/references/boundary-analysis.md +51 -0
- package/skills/erp-kit-module-1-requirements/references/erp-research.md +57 -0
- package/skills/erp-kit-module-1-requirements/references/feature-doc.md +61 -0
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +112 -0
- package/skills/erp-kit-module-2-requirements-review/references/best-practices-check.md +79 -0
- package/skills/erp-kit-module-2-requirements-review/references/boundary-consistency-check.md +70 -0
- package/skills/erp-kit-module-2-requirements-review/references/requirements-report-format.md +25 -0
- package/skills/erp-kit-module-3-plan/SKILL.md +107 -0
- package/skills/erp-kit-module-3-plan/references/command-extraction.md +87 -0
- package/skills/erp-kit-module-3-plan/references/model-extraction.md +72 -0
- package/skills/erp-kit-module-3-plan/references/query-extraction.md +59 -0
- package/skills/erp-kit-module-4-plan-review/SKILL.md +158 -0
- package/skills/erp-kit-module-4-plan-review/references/command-model-consistency.md +46 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-command-parity.md +97 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-model-parity.md +47 -0
- package/skills/erp-kit-module-4-plan-review/references/feature-query-parity.md +70 -0
- package/skills/erp-kit-module-4-plan-review/references/parity-report-format.md +52 -0
- package/skills/erp-kit-module-5-impl/SKILL.md +118 -0
- package/skills/erp-kit-module-5-impl/references/command-impl.md +68 -0
- package/skills/erp-kit-module-5-impl/references/exports.md +10 -0
- package/skills/erp-kit-module-5-impl/references/model-impl.md +45 -0
- package/skills/erp-kit-module-5-impl/references/query-impl.md +53 -0
- package/skills/erp-kit-module-6-impl-review/SKILL.md +187 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-code-parity.md +92 -0
- package/skills/erp-kit-module-6-impl-review/references/command-doc-test-parity.md +93 -0
- package/skills/erp-kit-module-6-impl-review/references/error-implementation-parity.md +95 -0
- package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/errors.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +52 -0
- package/skills/erp-kit-module-6-impl-review/references/model-doc-code-parity.md +80 -0
- package/skills/erp-kit-module-shared/SKILL.md +1 -1
- package/skills/erp-kit-module-shared/references/commands.md +1 -1
- package/skills/erp-kit-module-shared/references/errors.md +12 -9
- package/skills/erp-kit-module-shared/references/queries.md +109 -36
- package/skills/erp-kit-module-shared/references/testing.md +10 -0
- package/skills/erp-kit-update/SKILL.md +2 -2
- package/src/app.ts +1 -1
- package/src/commands/check.ts +1 -1
- package/src/commands/index.ts +16 -5
- package/src/commands/init.test.ts +22 -69
- package/src/commands/init.ts +28 -115
- package/src/commands/lib/distribute.test.ts +126 -0
- package/src/commands/lib/distribute.ts +129 -0
- package/src/commands/parse-doc-test-cases.ts +55 -0
- package/src/commands/scaffold.test.ts +74 -33
- package/src/commands/scaffold.ts +54 -18
- package/src/commands/sync-check.test.ts +173 -0
- package/src/commands/sync-check.ts +103 -2
- package/src/commands/update.test.ts +87 -0
- package/src/commands/update.ts +41 -0
- package/src/generator/generate-code.test.ts +23 -12
- package/src/generator/generate-code.ts +22 -16
- package/src/integration.test.ts +1 -1
- package/src/module.ts +20 -65
- package/src/modules/item-management/README.md +8 -0
- package/src/modules/item-management/command/activateItem.generated.ts +1 -1
- package/src/modules/item-management/command/activateItem.test.ts +12 -18
- package/src/modules/item-management/command/activateItem.ts +9 -5
- package/src/modules/item-management/command/assignItemToTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/assignItemToTaxonomy.test.ts +10 -24
- package/src/modules/item-management/command/assignItemToTaxonomy.ts +19 -16
- package/src/modules/item-management/command/createItem.generated.ts +1 -1
- package/src/modules/item-management/command/createItem.test.ts +11 -11
- package/src/modules/item-management/command/createItem.ts +16 -7
- package/src/modules/item-management/command/createTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/createTaxonomyNode.test.ts +9 -9
- package/src/modules/item-management/command/createTaxonomyNode.ts +33 -14
- package/src/modules/item-management/command/deactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/deactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/deactivateItem.ts +9 -5
- package/src/modules/item-management/command/deleteItem.generated.ts +1 -1
- package/src/modules/item-management/command/deleteItem.test.ts +10 -16
- package/src/modules/item-management/command/deleteItem.ts +9 -5
- package/src/modules/item-management/command/deleteTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/deleteTaxonomyNode.test.ts +10 -16
- package/src/modules/item-management/command/deleteTaxonomyNode.ts +22 -12
- package/src/modules/item-management/command/moveTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/moveTaxonomyNode.test.ts +10 -10
- package/src/modules/item-management/command/moveTaxonomyNode.ts +63 -19
- package/src/modules/item-management/command/reactivateItem.generated.ts +1 -1
- package/src/modules/item-management/command/reactivateItem.test.ts +12 -18
- package/src/modules/item-management/command/reactivateItem.ts +9 -5
- package/src/modules/item-management/command/removeItemFromTaxonomy.generated.ts +1 -1
- package/src/modules/item-management/command/removeItemFromTaxonomy.test.ts +9 -16
- package/src/modules/item-management/command/removeItemFromTaxonomy.ts +11 -6
- package/src/modules/item-management/command/updateItem.generated.ts +1 -1
- package/src/modules/item-management/command/updateItem.test.ts +16 -16
- package/src/modules/item-management/command/updateItem.ts +11 -6
- package/src/modules/item-management/command/updateTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/command/updateTaxonomyNode.test.ts +14 -20
- package/src/modules/item-management/command/updateTaxonomyNode.ts +9 -6
- package/src/modules/item-management/docs/commands/ActivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/AssignItemToTaxonomy.md +7 -0
- package/src/modules/item-management/docs/commands/CreateItem.md +10 -0
- package/src/modules/item-management/docs/commands/CreateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/commands/DeactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/DeleteItem.md +7 -0
- package/src/modules/item-management/docs/commands/DeleteTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/commands/MoveTaxonomyNode.md +10 -0
- package/src/modules/item-management/docs/commands/ReactivateItem.md +8 -0
- package/src/modules/item-management/docs/commands/RemoveItemFromTaxonomy.md +5 -0
- package/src/modules/item-management/docs/commands/UpdateItem.md +15 -0
- package/src/modules/item-management/docs/commands/UpdateTaxonomyNode.md +9 -0
- package/src/modules/item-management/docs/queries/CalculateNodeDepth.md +8 -0
- package/src/modules/item-management/docs/queries/CalculateSubtreeDepth.md +7 -0
- package/src/modules/item-management/docs/queries/DetectCircularReference.md +9 -0
- package/src/modules/item-management/docs/queries/GetItem.md +9 -0
- package/src/modules/item-management/docs/queries/GetItemTaxonomyAssignment.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNode.md +7 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeAssignments.md +5 -0
- package/src/modules/item-management/docs/queries/GetTaxonomyNodeChildren.md +6 -0
- package/src/modules/item-management/index.ts +0 -51
- package/src/modules/item-management/lib/errors.generated.ts +24 -24
- package/src/modules/item-management/lib/permissions.generated.ts +1 -1
- package/src/modules/item-management/lib/types.ts +1 -1
- package/src/modules/item-management/module.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateNodeDepth.test.ts +21 -6
- package/src/modules/item-management/query/calculateNodeDepth.ts +2 -2
- package/src/modules/item-management/query/calculateSubtreeDepth.generated.ts +1 -1
- package/src/modules/item-management/query/calculateSubtreeDepth.test.ts +17 -5
- package/src/modules/item-management/query/calculateSubtreeDepth.ts +2 -2
- package/src/modules/item-management/query/detectCircularReference.generated.ts +1 -1
- package/src/modules/item-management/query/detectCircularReference.test.ts +25 -7
- package/src/modules/item-management/query/detectCircularReference.ts +4 -4
- package/src/modules/item-management/query/getItem.generated.ts +1 -1
- package/src/modules/item-management/query/getItem.test.ts +25 -7
- package/src/modules/item-management/query/getItem.ts +2 -2
- package/src/modules/item-management/query/getItemTaxonomyAssignment.generated.ts +1 -1
- package/src/modules/item-management/query/getItemTaxonomyAssignment.test.ts +9 -3
- package/src/modules/item-management/query/getItemTaxonomyAssignment.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNode.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNode.test.ts +17 -5
- package/src/modules/item-management/query/getTaxonomyNode.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.test.ts +9 -3
- package/src/modules/item-management/query/getTaxonomyNodeAssignments.ts +2 -2
- package/src/modules/item-management/query/getTaxonomyNodeChildren.generated.ts +1 -1
- package/src/modules/item-management/query/getTaxonomyNodeChildren.test.ts +13 -4
- package/src/modules/item-management/query/getTaxonomyNodeChildren.ts +2 -2
- package/src/modules/item-management/tailor.config.ts +6 -4
- package/src/modules/item-management/tailor.d.ts +13 -0
- package/src/modules/primitives/README.md +8 -0
- package/src/modules/primitives/command/activateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/activateCategory.test.ts +8 -18
- package/src/modules/primitives/command/activateCategory.ts +9 -5
- package/src/modules/primitives/command/activateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/activateCurrency.test.ts +8 -18
- package/src/modules/primitives/command/activateCurrency.ts +9 -5
- package/src/modules/primitives/command/activateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/activateUnit.test.ts +8 -15
- package/src/modules/primitives/command/activateUnit.ts +9 -5
- package/src/modules/primitives/command/createCategory.generated.ts +1 -1
- package/src/modules/primitives/command/createCategory.test.ts +29 -44
- package/src/modules/primitives/command/createCategory.ts +9 -5
- package/src/modules/primitives/command/createCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/createCurrency.test.ts +53 -78
- package/src/modules/primitives/command/createCurrency.ts +9 -6
- package/src/modules/primitives/command/createExchangeRate.generated.ts +1 -1
- package/src/modules/primitives/command/createExchangeRate.test.ts +59 -97
- package/src/modules/primitives/command/createExchangeRate.ts +13 -7
- package/src/modules/primitives/command/createUnit.generated.ts +1 -1
- package/src/modules/primitives/command/createUnit.test.ts +59 -90
- package/src/modules/primitives/command/createUnit.ts +9 -6
- package/src/modules/primitives/command/deactivateCategory.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCategory.test.ts +15 -33
- package/src/modules/primitives/command/deactivateCategory.ts +9 -5
- package/src/modules/primitives/command/deactivateCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateCurrency.test.ts +12 -26
- package/src/modules/primitives/command/deactivateCurrency.ts +9 -5
- package/src/modules/primitives/command/deactivateUnit.generated.ts +1 -1
- package/src/modules/primitives/command/deactivateUnit.test.ts +15 -30
- package/src/modules/primitives/command/deactivateUnit.ts +14 -7
- package/src/modules/primitives/command/setBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/command/setBaseCurrency.test.ts +18 -40
- package/src/modules/primitives/command/setBaseCurrency.ts +15 -7
- package/src/modules/primitives/command/setReferenceUnit.generated.ts +1 -1
- package/src/modules/primitives/command/setReferenceUnit.test.ts +22 -44
- package/src/modules/primitives/command/setReferenceUnit.ts +21 -9
- package/src/modules/primitives/docs/commands/ActivateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateCurrency.md +6 -0
- package/src/modules/primitives/docs/commands/ActivateUnit.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCategory.md +6 -0
- package/src/modules/primitives/docs/commands/CreateCurrency.md +10 -0
- package/src/modules/primitives/docs/commands/CreateExchangeRate.md +11 -0
- package/src/modules/primitives/docs/commands/CreateUnit.md +10 -0
- package/src/modules/primitives/docs/commands/DeactivateCategory.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/DeactivateUnit.md +7 -0
- package/src/modules/primitives/docs/commands/SetBaseCurrency.md +7 -0
- package/src/modules/primitives/docs/commands/SetReferenceUnit.md +7 -0
- package/src/modules/primitives/docs/queries/ConvertAmount.md +14 -0
- package/src/modules/primitives/docs/queries/ConvertQuantity.md +13 -0
- package/src/modules/primitives/docs/queries/GetBaseCurrency.md +5 -0
- package/src/modules/primitives/docs/queries/GetCurrency.md +7 -0
- package/src/modules/primitives/docs/queries/GetUnit.md +7 -0
- package/src/modules/primitives/docs/queries/GetUoMCategory.md +7 -0
- package/src/modules/primitives/docs/queries/ListUnitsByCategory.md +15 -5
- package/src/modules/primitives/index.ts +0 -49
- package/src/modules/primitives/lib/errors.generated.ts +23 -23
- package/src/modules/primitives/lib/permissions.generated.ts +1 -1
- package/src/modules/primitives/lib/types.ts +1 -1
- package/src/modules/primitives/module.ts +1 -1
- package/src/modules/primitives/query/convertAmount.generated.ts +1 -1
- package/src/modules/primitives/query/convertAmount.test.ts +110 -77
- package/src/modules/primitives/query/convertAmount.ts +61 -47
- package/src/modules/primitives/query/convertQuantity.generated.ts +1 -1
- package/src/modules/primitives/query/convertQuantity.test.ts +99 -69
- package/src/modules/primitives/query/convertQuantity.ts +12 -10
- package/src/modules/primitives/query/getBaseCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getBaseCurrency.test.ts +10 -4
- package/src/modules/primitives/query/getBaseCurrency.ts +2 -2
- package/src/modules/primitives/query/getCurrency.generated.ts +1 -1
- package/src/modules/primitives/query/getCurrency.test.ts +17 -5
- package/src/modules/primitives/query/getCurrency.ts +2 -2
- package/src/modules/primitives/query/getUnit.generated.ts +1 -1
- package/src/modules/primitives/query/getUnit.test.ts +17 -5
- package/src/modules/primitives/query/getUnit.ts +2 -2
- package/src/modules/primitives/query/getUoMCategory.generated.ts +1 -1
- package/src/modules/primitives/query/getUoMCategory.test.ts +17 -5
- package/src/modules/primitives/query/getUoMCategory.ts +2 -2
- package/src/modules/primitives/query/listUnitsByCategory.generated.ts +1 -1
- package/src/modules/primitives/query/listUnitsByCategory.test.ts +80 -0
- package/src/modules/primitives/query/listUnitsByCategory.ts +19 -3
- package/src/modules/primitives/tailor.config.ts +6 -4
- package/src/modules/primitives/tailor.d.ts +13 -0
- package/src/modules/product-management/README.md +52 -0
- package/src/modules/product-management/command/activateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/activateProduct.test.ts +40 -0
- package/src/modules/product-management/command/activateProduct.ts +42 -0
- package/src/modules/product-management/command/assignProductToCategory.generated.ts +6 -0
- package/src/modules/product-management/command/assignProductToCategory.test.ts +90 -0
- package/src/modules/product-management/command/assignProductToCategory.ts +62 -0
- package/src/modules/product-management/command/createProduct.generated.ts +6 -0
- package/src/modules/product-management/command/createProduct.test.ts +149 -0
- package/src/modules/product-management/command/createProduct.ts +73 -0
- package/src/modules/product-management/command/createProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttribute.test.ts +70 -0
- package/src/modules/product-management/command/createProductAttribute.ts +53 -0
- package/src/modules/product-management/command/createProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/createProductAttributeValue.test.ts +68 -0
- package/src/modules/product-management/command/createProductAttributeValue.ts +63 -0
- package/src/modules/product-management/command/createProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/createProductCategory.test.ts +135 -0
- package/src/modules/product-management/command/createProductCategory.ts +82 -0
- package/src/modules/product-management/command/deactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/deactivateProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProduct.test.ts +42 -0
- package/src/modules/product-management/command/deleteProduct.ts +42 -0
- package/src/modules/product-management/command/deleteProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttribute.test.ts +49 -0
- package/src/modules/product-management/command/deleteProductAttribute.ts +45 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.test.ts +71 -0
- package/src/modules/product-management/command/deleteProductAttributeValue.ts +68 -0
- package/src/modules/product-management/command/deleteProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/deleteProductCategory.test.ts +74 -0
- package/src/modules/product-management/command/deleteProductCategory.ts +53 -0
- package/src/modules/product-management/command/generateVariants.generated.ts +6 -0
- package/src/modules/product-management/command/generateVariants.test.ts +365 -0
- package/src/modules/product-management/command/generateVariants.ts +168 -0
- package/src/modules/product-management/command/moveProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/moveProductCategory.test.ts +170 -0
- package/src/modules/product-management/command/moveProductCategory.ts +124 -0
- package/src/modules/product-management/command/reactivateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/reactivateProduct.test.ts +40 -0
- package/src/modules/product-management/command/reactivateProduct.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.generated.ts +6 -0
- package/src/modules/product-management/command/removeProductFromCategory.test.ts +42 -0
- package/src/modules/product-management/command/removeProductFromCategory.ts +32 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.generated.ts +6 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.test.ts +206 -0
- package/src/modules/product-management/command/setProductAttributeAssignment.ts +102 -0
- package/src/modules/product-management/command/updateProduct.generated.ts +6 -0
- package/src/modules/product-management/command/updateProduct.test.ts +168 -0
- package/src/modules/product-management/command/updateProduct.ts +95 -0
- package/src/modules/product-management/command/updateProductAttribute.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttribute.test.ts +101 -0
- package/src/modules/product-management/command/updateProductAttribute.ts +68 -0
- package/src/modules/product-management/command/updateProductAttributeValue.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductAttributeValue.test.ts +80 -0
- package/src/modules/product-management/command/updateProductAttributeValue.ts +58 -0
- package/src/modules/product-management/command/updateProductCategory.generated.ts +6 -0
- package/src/modules/product-management/command/updateProductCategory.test.ts +80 -0
- package/src/modules/product-management/command/updateProductCategory.ts +66 -0
- package/src/modules/product-management/db/product.ts +47 -0
- package/src/modules/product-management/db/productAttribute.ts +26 -0
- package/src/modules/product-management/db/productAttributeAssignment.ts +58 -0
- package/src/modules/product-management/db/productAttributeValue.ts +39 -0
- package/src/modules/product-management/db/productCategory.ts +34 -0
- package/src/modules/product-management/db/productCategoryAssignment.ts +49 -0
- package/src/modules/product-management/db/productVariant.ts +52 -0
- package/src/modules/product-management/docs/commands/ActivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/AssignProductToCategory.md +43 -0
- package/src/modules/product-management/docs/commands/CreateProduct.md +48 -0
- package/src/modules/product-management/docs/commands/CreateProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/CreateProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/CreateProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/DeactivateProduct.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProduct.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttribute.md +39 -0
- package/src/modules/product-management/docs/commands/DeleteProductAttributeValue.md +42 -0
- package/src/modules/product-management/docs/commands/DeleteProductCategory.md +43 -0
- package/src/modules/product-management/docs/commands/GenerateVariants.md +68 -0
- package/src/modules/product-management/docs/commands/MoveProductCategory.md +54 -0
- package/src/modules/product-management/docs/commands/ReactivateProduct.md +38 -0
- package/src/modules/product-management/docs/commands/RemoveProductFromCategory.md +34 -0
- package/src/modules/product-management/docs/commands/SetProductAttributeAssignment.md +62 -0
- package/src/modules/product-management/docs/commands/UpdateProduct.md +61 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttribute.md +46 -0
- package/src/modules/product-management/docs/commands/UpdateProductAttributeValue.md +47 -0
- package/src/modules/product-management/docs/commands/UpdateProductCategory.md +46 -0
- package/src/modules/product-management/docs/features/attribute-management.md +48 -0
- package/src/modules/product-management/docs/features/product-category.md +71 -0
- package/src/modules/product-management/docs/features/product-lifecycle.md +66 -0
- package/src/modules/product-management/docs/features/variant-generation.md +77 -0
- package/src/modules/product-management/docs/models/Product.md +58 -0
- package/src/modules/product-management/docs/models/ProductAttribute.md +37 -0
- package/src/modules/product-management/docs/models/ProductAttributeAssignment.md +41 -0
- package/src/modules/product-management/docs/models/ProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/models/ProductCategory.md +46 -0
- package/src/modules/product-management/docs/models/ProductCategoryAssignment.md +37 -0
- package/src/modules/product-management/docs/models/ProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/CalculateCategoryDepth.md +47 -0
- package/src/modules/product-management/docs/queries/DetectCategoryCircularReference.md +51 -0
- package/src/modules/product-management/docs/queries/GetProduct.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttribute.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductAttributeValue.md +40 -0
- package/src/modules/product-management/docs/queries/GetProductCategory.md +42 -0
- package/src/modules/product-management/docs/queries/GetProductCategoryAssignment.md +34 -0
- package/src/modules/product-management/docs/queries/GetProductVariant.md +41 -0
- package/src/modules/product-management/docs/queries/ListAttributeAssignmentsByAttribute.md +34 -0
- package/src/modules/product-management/docs/queries/ListCategoryAssignmentsByProduct.md +35 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductAttributeValues.md +36 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryAssignments.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductCategoryChildren.md +34 -0
- package/src/modules/product-management/docs/queries/ListProductVariants.md +34 -0
- package/src/modules/product-management/generated/enums.ts +9 -0
- package/src/modules/product-management/generated/kysely-tailordb.ts +100 -0
- package/src/modules/product-management/index.ts +2 -0
- package/src/modules/product-management/lib/_db_deps.ts +17 -0
- package/src/modules/product-management/lib/errors.generated.ts +152 -0
- package/src/modules/product-management/lib/permissions.generated.ts +25 -0
- package/src/modules/product-management/lib/types.ts +51 -0
- package/src/modules/product-management/module.ts +201 -0
- package/src/modules/product-management/query/calculateCategoryDepth.generated.ts +5 -0
- package/src/modules/product-management/query/calculateCategoryDepth.test.ts +72 -0
- package/src/modules/product-management/query/calculateCategoryDepth.ts +37 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.generated.ts +5 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.test.ts +72 -0
- package/src/modules/product-management/query/detectCategoryCircularReference.ts +44 -0
- package/src/modules/product-management/query/getProduct.generated.ts +5 -0
- package/src/modules/product-management/query/getProduct.test.ts +59 -0
- package/src/modules/product-management/query/getProduct.ts +18 -0
- package/src/modules/product-management/query/getProductAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttribute.test.ts +59 -0
- package/src/modules/product-management/query/getProductAttribute.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductAttributeAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductAttributeValue.generated.ts +5 -0
- package/src/modules/product-management/query/getProductAttributeValue.test.ts +31 -0
- package/src/modules/product-management/query/getProductAttributeValue.ts +16 -0
- package/src/modules/product-management/query/getProductCategory.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategory.test.ts +59 -0
- package/src/modules/product-management/query/getProductCategory.ts +18 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.generated.ts +5 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.test.ts +37 -0
- package/src/modules/product-management/query/getProductCategoryAssignment.ts +18 -0
- package/src/modules/product-management/query/getProductVariant.generated.ts +5 -0
- package/src/modules/product-management/query/getProductVariant.test.ts +43 -0
- package/src/modules/product-management/query/getProductVariant.ts +20 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.generated.ts +5 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.test.ts +31 -0
- package/src/modules/product-management/query/listAttributeAssignmentsByAttribute.ts +16 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.generated.ts +5 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.test.ts +31 -0
- package/src/modules/product-management/query/listCategoryAssignmentsByProduct.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductAttributeValues.generated.ts +5 -0
- package/src/modules/product-management/query/listProductAttributeValues.test.ts +31 -0
- package/src/modules/product-management/query/listProductAttributeValues.ts +17 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryAssignments.ts +16 -0
- package/src/modules/product-management/query/listProductCategoryChildren.generated.ts +5 -0
- package/src/modules/product-management/query/listProductCategoryChildren.test.ts +31 -0
- package/src/modules/product-management/query/listProductCategoryChildren.ts +16 -0
- package/src/modules/product-management/query/listProductVariants.generated.ts +5 -0
- package/src/modules/product-management/query/listProductVariants.test.ts +31 -0
- package/src/modules/product-management/query/listProductVariants.ts +16 -0
- package/src/modules/product-management/tailor.config.ts +13 -0
- package/src/modules/product-management/tailor.d.ts +13 -0
- package/src/modules/product-management/testing/fixtures.ts +151 -0
- package/src/modules/user-management/README.md +9 -3
- package/src/modules/user-management/command/activateUser.generated.ts +1 -1
- package/src/modules/user-management/command/activateUser.test.ts +12 -65
- package/src/modules/user-management/command/activateUser.ts +5 -20
- package/src/modules/user-management/command/assignPermissionToRole.generated.ts +1 -1
- package/src/modules/user-management/command/assignPermissionToRole.test.ts +25 -60
- package/src/modules/user-management/command/assignPermissionToRole.ts +5 -24
- package/src/modules/user-management/command/assignRoleToUser.generated.ts +1 -1
- package/src/modules/user-management/command/assignRoleToUser.test.ts +35 -87
- package/src/modules/user-management/command/assignRoleToUser.ts +5 -24
- package/src/modules/user-management/command/createPermission.generated.ts +1 -1
- package/src/modules/user-management/command/createPermission.test.ts +23 -33
- package/src/modules/user-management/command/createPermission.ts +4 -5
- package/src/modules/user-management/command/createRole.generated.ts +1 -1
- package/src/modules/user-management/command/createRole.test.ts +17 -27
- package/src/modules/user-management/command/createRole.ts +4 -5
- package/src/modules/user-management/command/createUser.generated.ts +1 -1
- package/src/modules/user-management/command/createUser.test.ts +31 -118
- package/src/modules/user-management/command/createUser.ts +7 -25
- package/src/modules/user-management/command/deactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/deactivateUser.test.ts +12 -65
- package/src/modules/user-management/command/deactivateUser.ts +6 -21
- package/src/modules/user-management/command/reactivateUser.generated.ts +1 -1
- package/src/modules/user-management/command/reactivateUser.test.ts +13 -66
- package/src/modules/user-management/command/reactivateUser.ts +5 -20
- package/src/modules/user-management/command/revokePermissionFromRole.generated.ts +1 -1
- package/src/modules/user-management/command/revokePermissionFromRole.test.ts +24 -62
- package/src/modules/user-management/command/revokePermissionFromRole.ts +5 -24
- package/src/modules/user-management/command/revokeRoleFromUser.generated.ts +1 -1
- package/src/modules/user-management/command/revokeRoleFromUser.test.ts +24 -60
- package/src/modules/user-management/command/revokeRoleFromUser.ts +5 -24
- package/src/modules/user-management/docs/commands/ActivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/AssignPermissionToRole.md +7 -0
- package/src/modules/user-management/docs/commands/AssignRoleToUser.md +9 -0
- package/src/modules/user-management/docs/commands/CreatePermission.md +12 -0
- package/src/modules/user-management/docs/commands/CreateRole.md +9 -0
- package/src/modules/user-management/docs/commands/CreateUser.md +11 -0
- package/src/modules/user-management/docs/commands/DeactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/ReactivateUser.md +7 -0
- package/src/modules/user-management/docs/commands/RevokePermissionFromRole.md +7 -0
- package/src/modules/user-management/docs/commands/RevokeRoleFromUser.md +7 -0
- package/src/modules/user-management/index.ts +0 -30
- package/src/modules/user-management/lib/errors.generated.ts +14 -14
- package/src/modules/user-management/lib/permissions.generated.ts +1 -2
- package/src/modules/user-management/lib/recomputeUserPermissions.ts +4 -3
- package/src/modules/user-management/lib/types.ts +1 -1
- package/src/modules/user-management/module.ts +2 -7
- package/src/modules/user-management/tailor.config.ts +6 -4
- package/src/modules/user-management/tailor.d.ts +13 -0
- package/src/modules/user-management/testing/fixtures.ts +1 -20
- package/src/schemas.ts +1 -1
- package/src/{modules/shared → shared}/defineCommand.test.ts +23 -7
- package/src/{modules/shared → shared}/defineCommand.ts +19 -10
- package/src/{modules/shared/internal.ts → shared/index.ts} +9 -1
- package/src/shared/pagination.test.ts +43 -0
- package/src/shared/pagination.ts +22 -0
- package/src/{modules/shared → shared}/types.ts +13 -0
- package/src/{modules/testing → testing}/index.ts +14 -7
- package/src/testing.ts +1 -1
- package/src/util.ts +8 -0
- package/templates/config/license.config.json +4 -0
- package/templates/scaffold/app/backend/.env.example +1 -0
- package/templates/scaffold/app/backend/__dot__gitignore +4 -0
- package/templates/scaffold/app/backend/eslint.config.js +32 -0
- package/templates/scaffold/app/backend/package.json +31 -0
- package/templates/scaffold/app/backend/seed/data/AuditEvent.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Permission.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/Role.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/Role.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/RolePermission.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/User.schema.ts +20 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.jsonl +0 -0
- package/templates/scaffold/app/backend/seed/data/UserRole.schema.ts +24 -0
- package/templates/scaffold/app/backend/seed/data/_User.jsonl +1 -0
- package/templates/scaffold/app/backend/seed/data/_User.schema.ts +30 -0
- package/templates/scaffold/app/backend/seed/exec.mjs +659 -0
- package/templates/scaffold/app/backend/src/executors/permissionCreated.ts +3 -0
- package/templates/scaffold/app/backend/src/executors/permissionDeleted.ts +3 -0
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +83 -0
- package/templates/scaffold/app/backend/src/modules.ts +9 -0
- package/templates/scaffold/app/backend/src/resolvers/createUser.ts +46 -0
- package/templates/scaffold/app/backend/tailor.config.ts +68 -0
- package/templates/scaffold/app/backend/tailor.d.ts +15 -0
- package/templates/scaffold/app/backend/tsconfig.json +19 -0
- package/templates/scaffold/app/docs/actors/.gitkeep +0 -0
- package/templates/scaffold/app/docs/business-flow/.gitkeep +0 -0
- package/templates/scaffold/app/docs/resolver/.gitkeep +0 -0
- package/templates/scaffold/app/docs/screen/.gitkeep +0 -0
- package/templates/scaffold/app/frontend/.env.example +2 -0
- package/templates/scaffold/app/frontend/__dot__gitignore +3 -0
- package/templates/scaffold/app/frontend/components.json +23 -0
- package/templates/scaffold/app/frontend/eslint.config.js +48 -0
- package/templates/scaffold/app/frontend/index.html +13 -0
- package/templates/scaffold/app/frontend/package.json +53 -0
- package/templates/scaffold/app/frontend/scripts/generate-graphql.mjs +6 -0
- package/templates/scaffold/app/frontend/src/App.tsx +58 -0
- package/templates/scaffold/app/frontend/src/components/composed/empty-state.tsx +26 -0
- package/templates/scaffold/app/frontend/src/components/composed/error-fallback.tsx +28 -0
- package/templates/scaffold/app/frontend/src/components/composed/loading.tsx +13 -0
- package/templates/scaffold/app/frontend/src/components/ui/badge.tsx +39 -0
- package/templates/scaffold/app/frontend/src/components/ui/button.tsx +60 -0
- package/templates/scaffold/app/frontend/src/components/ui/card.tsx +75 -0
- package/templates/scaffold/app/frontend/src/components/ui/form.tsx +152 -0
- package/templates/scaffold/app/frontend/src/components/ui/input.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/label.tsx +21 -0
- package/templates/scaffold/app/frontend/src/components/ui/spinner.tsx +16 -0
- package/templates/scaffold/app/frontend/src/components/ui/table.tsx +90 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/graphql-env.d.ts +103 -0
- package/templates/scaffold/app/frontend/src/graphql/generated/schema.graphql +1235 -0
- package/templates/scaffold/app/frontend/src/graphql/index.ts +15 -0
- package/templates/scaffold/app/frontend/src/index.css +5 -0
- package/templates/scaffold/app/frontend/src/lib/auth-client.ts +17 -0
- package/templates/scaffold/app/frontend/src/lib/utils.ts +6 -0
- package/templates/scaffold/app/frontend/src/main.tsx +10 -0
- package/templates/scaffold/app/frontend/src/pages/page.tsx +20 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/profile/page.tsx +97 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/components/user-detail.tsx +58 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/[id]/page.tsx +51 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/components/users-table.tsx +101 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/components/create-user-form.tsx +99 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/create/page.tsx +19 -0
- package/templates/scaffold/app/frontend/src/pages/user-management/user/page.tsx +61 -0
- package/templates/scaffold/app/frontend/src/providers/graphql-provider.tsx +21 -0
- package/templates/scaffold/app/frontend/tsconfig.app.json +35 -0
- package/templates/scaffold/app/frontend/tsconfig.json +16 -0
- package/templates/scaffold/app/frontend/tsconfig.node.json +23 -0
- package/templates/scaffold/app/frontend/vite.config.ts +23 -0
- package/templates/scaffold/module/command/.gitkeep +0 -0
- package/templates/scaffold/module/db/.gitkeep +0 -0
- package/templates/scaffold/module/executor/.gitkeep +0 -0
- package/templates/scaffold/module/generated/.gitkeep +0 -0
- package/templates/scaffold/module/index.ts +2 -0
- package/templates/scaffold/module/lib/errors.ts +1 -0
- package/templates/scaffold/module/lib/types.ts +4 -0
- package/templates/scaffold/module/module.ts +7 -0
- package/templates/scaffold/module/permissions.ts +3 -0
- package/templates/scaffold/module/query/.gitkeep +0 -0
- package/templates/scaffold/module/tailor.config.ts +13 -0
- package/templates/scaffold/module/testing/fixtures.ts +1 -0
- package/templates/workflows/erp-kit-check.yml +37 -0
- package/dist/cli.js +0 -1654
- package/skills/erp-kit-app-1-requirements/references/structure.md +0 -27
- package/skills/erp-kit-app-2-breakdown/SKILL.md +0 -95
- package/skills/erp-kit-app-2-breakdown/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-2-breakdown/references/screen-form.md +0 -139
- package/skills/erp-kit-app-2-breakdown/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-2-breakdown/references/structure.md +0 -27
- package/skills/erp-kit-app-3-doc-review/SKILL.md +0 -116
- package/skills/erp-kit-app-3-doc-review/references/structure.md +0 -27
- package/skills/erp-kit-app-4-design/SKILL.md +0 -256
- package/skills/erp-kit-app-4-design/references/component.md +0 -50
- package/skills/erp-kit-app-4-design/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-4-design/references/screen-form.md +0 -139
- package/skills/erp-kit-app-4-design/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-4-design/references/structure.md +0 -27
- package/skills/erp-kit-app-5-design-review/SKILL.md +0 -290
- package/skills/erp-kit-app-5-design-review/references/component.md +0 -50
- package/skills/erp-kit-app-5-design-review/references/screen-detailview.md +0 -106
- package/skills/erp-kit-app-5-design-review/references/screen-form.md +0 -139
- package/skills/erp-kit-app-5-design-review/references/screen-listview.md +0 -153
- package/skills/erp-kit-app-6-impl-spec/SKILL.md +0 -127
- package/skills/erp-kit-app-6-impl-spec/references/auth.md +0 -72
- package/skills/erp-kit-app-6-impl-spec/references/structure.md +0 -27
- package/skills/erp-kit-module-1-docs/SKILL.md +0 -111
- package/skills/erp-kit-module-2-feature-breakdown/SKILL.md +0 -76
- package/skills/erp-kit-module-3-doc-review/SKILL.md +0 -294
- package/skills/erp-kit-module-4-tdd/SKILL.md +0 -94
- package/skills/erp-kit-module-4-tdd/references/exports.md +0 -8
- package/skills/erp-kit-module-5-impl-review/SKILL.md +0 -410
- package/src/commands/scaffold-templates.ts +0 -65
- package/src/modules/shared/index.ts +0 -1
- package/src/modules/user-management/command/logAuditEvent.generated.ts +0 -6
- package/src/modules/user-management/command/logAuditEvent.test.ts +0 -187
- package/src/modules/user-management/command/logAuditEvent.ts +0 -56
- package/src/modules/user-management/db/auditEvent.ts +0 -47
- package/src/modules/user-management/docs/commands/LogAuditEvent.md +0 -37
- package/src/modules/user-management/docs/features/audit-trail.md +0 -80
- package/src/modules/user-management/docs/models/AuditEvent.md +0 -36
- /package/skills/{erp-kit-module-2-feature-breakdown → erp-kit-module-3-plan}/references/naming.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/cross-module-dependency.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/db-relations.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/generated-code.md +0 -0
- /package/skills/{erp-kit-module-4-tdd → erp-kit-module-5-impl}/references/models.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/commands.md +0 -0
- /package/skills/{erp-kit-module-5-impl-review → erp-kit-module-6-impl-review}/references/testing.md +0 -0
- /package/src/modules/{product-management → audit}/.gitkeep +0 -0
- /package/src/{modules/shared → shared}/createContext.test.ts +0 -0
- /package/src/{modules/shared → shared}/createContext.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.test.ts +0 -0
- /package/src/{modules/shared → shared}/definePermissions.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.test.ts +0 -0
- /package/src/{modules/shared → shared}/defineQuery.ts +0 -0
- /package/src/{modules/shared → shared}/entityTypes.ts +0 -0
- /package/src/{modules/shared → shared}/errors.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.test.ts +0 -0
- /package/src/{modules/shared → shared}/requirePermission.ts +0 -0
- /package/src/{modules/shared → shared}/result.ts +0 -0
|
@@ -1,34 +1,23 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { DB } from "../generated/kysely-tailordb";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import { Transaction } from "../generated/kysely-tailordb";
|
|
5
4
|
import {
|
|
6
5
|
AssignmentNotFoundError,
|
|
7
6
|
RoleNotFoundError,
|
|
8
7
|
UserNotFoundError,
|
|
9
8
|
} from "../lib/errors.generated";
|
|
10
|
-
import { activeUser,
|
|
9
|
+
import { activeUser, baseRole, baseUserRole } from "../testing/fixtures";
|
|
11
10
|
import { run } from "./revokeRoleFromUser";
|
|
12
11
|
|
|
13
12
|
describe("revokeRoleFromUser", () => {
|
|
14
|
-
const ctx: CommandContext = {
|
|
15
|
-
actorId: "test-actor",
|
|
16
|
-
permissions: ["user-management:revokeRoleFromUser"],
|
|
17
|
-
};
|
|
18
|
-
|
|
19
13
|
it("throws when user does not exist", async () => {
|
|
20
|
-
const { db, spies } = createMockDb<
|
|
14
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
21
15
|
spies.select.mockReturnValue(undefined);
|
|
22
16
|
|
|
23
|
-
const result = await run(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
roleId: baseRole.id,
|
|
28
|
-
actorId: "actor-1",
|
|
29
|
-
},
|
|
30
|
-
ctx,
|
|
31
|
-
);
|
|
17
|
+
const result = await run(db, {
|
|
18
|
+
userId: "nonexistent-user",
|
|
19
|
+
roleId: baseRole.id,
|
|
20
|
+
});
|
|
32
21
|
expect(result.ok).toBe(false);
|
|
33
22
|
if (!result.ok) {
|
|
34
23
|
expect(result.error).toBeInstanceOf(UserNotFoundError);
|
|
@@ -36,18 +25,13 @@ describe("revokeRoleFromUser", () => {
|
|
|
36
25
|
});
|
|
37
26
|
|
|
38
27
|
it("throws when role does not exist", async () => {
|
|
39
|
-
const { db, spies } = createMockDb<
|
|
28
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
40
29
|
spies.select.mockReturnValueOnce(activeUser).mockReturnValueOnce(undefined);
|
|
41
30
|
|
|
42
|
-
const result = await run(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
roleId: "nonexistent-role",
|
|
47
|
-
actorId: "actor-1",
|
|
48
|
-
},
|
|
49
|
-
ctx,
|
|
50
|
-
);
|
|
31
|
+
const result = await run(db, {
|
|
32
|
+
userId: activeUser.id,
|
|
33
|
+
roleId: "nonexistent-role",
|
|
34
|
+
});
|
|
51
35
|
expect(result.ok).toBe(false);
|
|
52
36
|
if (!result.ok) {
|
|
53
37
|
expect(result.error).toBeInstanceOf(RoleNotFoundError);
|
|
@@ -55,36 +39,24 @@ describe("revokeRoleFromUser", () => {
|
|
|
55
39
|
});
|
|
56
40
|
|
|
57
41
|
it("throws when assignment does not exist", async () => {
|
|
58
|
-
const { db, spies } = createMockDb<
|
|
42
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
59
43
|
spies.select
|
|
60
44
|
.mockReturnValueOnce(activeUser)
|
|
61
45
|
.mockReturnValueOnce(baseRole)
|
|
62
46
|
.mockReturnValueOnce(undefined);
|
|
63
47
|
|
|
64
|
-
const result = await run(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
roleId: baseRole.id,
|
|
69
|
-
actorId: "actor-1",
|
|
70
|
-
},
|
|
71
|
-
ctx,
|
|
72
|
-
);
|
|
48
|
+
const result = await run(db, {
|
|
49
|
+
userId: activeUser.id,
|
|
50
|
+
roleId: baseRole.id,
|
|
51
|
+
});
|
|
73
52
|
expect(result.ok).toBe(false);
|
|
74
53
|
if (!result.ok) {
|
|
75
54
|
expect(result.error).toBeInstanceOf(AssignmentNotFoundError);
|
|
76
55
|
}
|
|
77
56
|
});
|
|
78
57
|
|
|
79
|
-
it("deletes UserRole and
|
|
80
|
-
const { db, spies } = createMockDb<
|
|
81
|
-
const createdAuditEvent = {
|
|
82
|
-
...baseAuditEvent,
|
|
83
|
-
eventType: "ROLE_REVOKED" as const,
|
|
84
|
-
actorId: "actor-1",
|
|
85
|
-
targetId: activeUser.id,
|
|
86
|
-
targetType: "User",
|
|
87
|
-
};
|
|
58
|
+
it("deletes UserRole and recomputes permissions", async () => {
|
|
59
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
88
60
|
const updatedUser = { ...activeUser, permissions: [] };
|
|
89
61
|
|
|
90
62
|
spies.select
|
|
@@ -93,23 +65,15 @@ describe("revokeRoleFromUser", () => {
|
|
|
93
65
|
.mockReturnValueOnce(baseUserRole)
|
|
94
66
|
.mockReturnValueOnce([]); // Permission keys from recompute (empty after revoke)
|
|
95
67
|
spies.delete.mockReturnValue(baseUserRole);
|
|
96
|
-
spies.insert.mockReturnValue(createdAuditEvent);
|
|
97
68
|
spies.update.mockReturnValue(updatedUser);
|
|
98
69
|
|
|
99
|
-
const result = await run(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
roleId: baseRole.id,
|
|
104
|
-
actorId: "actor-1",
|
|
105
|
-
},
|
|
106
|
-
ctx,
|
|
107
|
-
);
|
|
70
|
+
const result = await run(db, {
|
|
71
|
+
userId: activeUser.id,
|
|
72
|
+
roleId: baseRole.id,
|
|
73
|
+
});
|
|
108
74
|
|
|
109
75
|
expect(result.ok).toBe(true);
|
|
110
76
|
if (result.ok) {
|
|
111
|
-
expect(result.value.auditEvent.eventType).toBe("ROLE_REVOKED");
|
|
112
|
-
expect(result.value.auditEvent.targetId).toBe(activeUser.id);
|
|
113
77
|
expect(result.value.user.permissions).toEqual([]);
|
|
114
78
|
}
|
|
115
79
|
expect(spies.delete).toHaveBeenCalled();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ok, err
|
|
2
|
-
import {
|
|
1
|
+
import { ok, err } from "../../../shared";
|
|
2
|
+
import { Transaction } from "../generated/kysely-tailordb";
|
|
3
3
|
import {
|
|
4
4
|
AssignmentNotFoundError,
|
|
5
5
|
RoleNotFoundError,
|
|
@@ -10,7 +10,6 @@ import { recomputeUserPermissions } from "../lib/recomputeUserPermissions";
|
|
|
10
10
|
export interface RevokeRoleFromUserInput {
|
|
11
11
|
userId: string;
|
|
12
12
|
roleId: string;
|
|
13
|
-
actorId: string;
|
|
14
13
|
}
|
|
15
14
|
|
|
16
15
|
/**
|
|
@@ -19,8 +18,7 @@ export interface RevokeRoleFromUserInput {
|
|
|
19
18
|
* Removes a role from a user.
|
|
20
19
|
* Throws an error if the assignment does not exist.
|
|
21
20
|
*/
|
|
22
|
-
|
|
23
|
-
export async function run(db: DB, input: RevokeRoleFromUserInput, _ctx: CommandContext) {
|
|
21
|
+
export async function run(db: Transaction, input: RevokeRoleFromUserInput) {
|
|
24
22
|
const user = await db
|
|
25
23
|
.selectFrom("User")
|
|
26
24
|
.selectAll()
|
|
@@ -46,6 +44,7 @@ export async function run(db: DB, input: RevokeRoleFromUserInput, _ctx: CommandC
|
|
|
46
44
|
.selectAll()
|
|
47
45
|
.where("userId", "=", input.userId)
|
|
48
46
|
.where("roleId", "=", input.roleId)
|
|
47
|
+
.forUpdate()
|
|
49
48
|
.executeTakeFirst();
|
|
50
49
|
|
|
51
50
|
if (!existingAssignment) {
|
|
@@ -58,25 +57,7 @@ export async function run(db: DB, input: RevokeRoleFromUserInput, _ctx: CommandC
|
|
|
58
57
|
.returningAll()
|
|
59
58
|
.executeTakeFirst();
|
|
60
59
|
|
|
61
|
-
const auditEvent = await db
|
|
62
|
-
.insertInto("AuditEvent")
|
|
63
|
-
.values({
|
|
64
|
-
eventType: "ROLE_REVOKED",
|
|
65
|
-
actorId: input.actorId,
|
|
66
|
-
targetId: input.userId,
|
|
67
|
-
targetType: "User",
|
|
68
|
-
payload: JSON.stringify({
|
|
69
|
-
userId: input.userId,
|
|
70
|
-
roleId: input.roleId,
|
|
71
|
-
roleName: role.name,
|
|
72
|
-
}),
|
|
73
|
-
createdAt: new Date(),
|
|
74
|
-
updatedAt: null,
|
|
75
|
-
})
|
|
76
|
-
.returningAll()
|
|
77
|
-
.executeTakeFirst();
|
|
78
|
-
|
|
79
60
|
const updatedUser = await recomputeUserPermissions(db, input.userId);
|
|
80
61
|
|
|
81
|
-
return ok({ user: updatedUser
|
|
62
|
+
return ok({ user: updatedUser });
|
|
82
63
|
}
|
|
@@ -34,3 +34,10 @@ flowchart TD
|
|
|
34
34
|
|
|
35
35
|
- **USER_NOT_FOUND**: User ID does not exist in the system - return not found error with the provided ID
|
|
36
36
|
- **INVALID_STATUS_TRANSITION**: User is not in PENDING status (already ACTIVE or INACTIVE) - return error with current status and valid transitions
|
|
37
|
+
|
|
38
|
+
## Test Cases
|
|
39
|
+
|
|
40
|
+
- throws when user does not exist
|
|
41
|
+
- throws when user is already ACTIVE
|
|
42
|
+
- throws when user is INACTIVE (use reactivateUser instead)
|
|
43
|
+
- activates PENDING user to ACTIVE
|
|
@@ -37,3 +37,10 @@ flowchart TD
|
|
|
37
37
|
|
|
38
38
|
- **ROLE_NOT_FOUND**: Role ID does not exist in the system - return not found error with the provided role ID
|
|
39
39
|
- **PERMISSION_NOT_FOUND**: Permission ID does not exist in the system - return not found error with the provided permission ID
|
|
40
|
+
|
|
41
|
+
## Test Cases
|
|
42
|
+
|
|
43
|
+
- throws when role does not exist
|
|
44
|
+
- throws when permission does not exist
|
|
45
|
+
- returns success when assignment already exists (idempotent)
|
|
46
|
+
- creates RolePermission
|
|
@@ -41,3 +41,12 @@ flowchart TD
|
|
|
41
41
|
- **USER_NOT_FOUND**: User ID does not exist in the system - return not found error with the provided user ID
|
|
42
42
|
- **ROLE_NOT_FOUND**: Role ID does not exist in the system - return not found error with the provided role ID
|
|
43
43
|
- **USER_NOT_ACTIVE**: User is in PENDING or INACTIVE status - return error indicating only ACTIVE users can receive role assignments
|
|
44
|
+
|
|
45
|
+
## Test Cases
|
|
46
|
+
|
|
47
|
+
- throws when user does not exist
|
|
48
|
+
- throws when role does not exist
|
|
49
|
+
- throws when user is PENDING
|
|
50
|
+
- throws when user is INACTIVE
|
|
51
|
+
- returns success when assignment already exists (idempotent)
|
|
52
|
+
- creates UserRole and recomputes permissions
|
|
@@ -33,3 +33,15 @@ flowchart TD
|
|
|
33
33
|
|
|
34
34
|
- **INVALID_PERMISSION_KEY_FORMAT**: Key does not match `resource:action` pattern
|
|
35
35
|
- **DUPLICATE_PERMISSION_KEY**: Permission with the same key already exists
|
|
36
|
+
|
|
37
|
+
## Test Cases
|
|
38
|
+
|
|
39
|
+
- throws when key is empty
|
|
40
|
+
- throws when key format is invalid (no colon)
|
|
41
|
+
- throws when key format is invalid (multiple colons)
|
|
42
|
+
- throws when key format is invalid (empty resource)
|
|
43
|
+
- throws when key format is invalid (empty action)
|
|
44
|
+
- throws when permission key already exists
|
|
45
|
+
- creates permission with valid key
|
|
46
|
+
- creates permission with description
|
|
47
|
+
- passes custom fields through to insert
|
|
@@ -33,3 +33,12 @@ flowchart TD
|
|
|
33
33
|
|
|
34
34
|
- **MISSING_REQUIRED_FIELD**: Role name not provided - return validation error indicating name is required
|
|
35
35
|
- **DUPLICATE_ROLE_NAME**: Role with the same name already exists
|
|
36
|
+
|
|
37
|
+
## Test Cases
|
|
38
|
+
|
|
39
|
+
- throws when name is empty
|
|
40
|
+
- throws when name is whitespace only
|
|
41
|
+
- throws when role name already exists
|
|
42
|
+
- creates role with valid name
|
|
43
|
+
- creates role with description
|
|
44
|
+
- passes custom fields through to insert
|
|
@@ -39,3 +39,14 @@ flowchart TD
|
|
|
39
39
|
- **USER_ALREADY_EXISTS**: Email address is already registered in the system - return conflict error with message indicating email is taken
|
|
40
40
|
- **INVALID_EMAIL**: Email does not follow valid email format - return validation error with format requirements
|
|
41
41
|
- **MISSING_REQUIRED_FIELD**: Name or email not provided - return validation error listing missing fields
|
|
42
|
+
|
|
43
|
+
## Test Cases
|
|
44
|
+
|
|
45
|
+
- throws when email is empty
|
|
46
|
+
- throws when name is empty
|
|
47
|
+
- throws when name is whitespace only
|
|
48
|
+
- throws when email format is invalid (no @)
|
|
49
|
+
- throws when email format is invalid (no domain)
|
|
50
|
+
- throws when email already exists
|
|
51
|
+
- creates user with PENDING status
|
|
52
|
+
- passes custom fields through to insert
|
|
@@ -36,3 +36,10 @@ flowchart TD
|
|
|
36
36
|
|
|
37
37
|
- **USER_NOT_FOUND**: User ID does not exist in the system - return not found error with the provided ID
|
|
38
38
|
- **INVALID_STATUS_TRANSITION**: User is not in ACTIVE status (PENDING or already INACTIVE) - return error with current status and valid transitions
|
|
39
|
+
|
|
40
|
+
## Test Cases
|
|
41
|
+
|
|
42
|
+
- throws when user does not exist
|
|
43
|
+
- throws when user is PENDING
|
|
44
|
+
- throws when user is already INACTIVE
|
|
45
|
+
- deactivates ACTIVE user to INACTIVE
|
|
@@ -35,3 +35,10 @@ flowchart TD
|
|
|
35
35
|
|
|
36
36
|
- **USER_NOT_FOUND**: User ID does not exist in the system - return not found error with the provided ID
|
|
37
37
|
- **INVALID_STATUS_TRANSITION**: User is not in INACTIVE status (PENDING or already ACTIVE) - return error with current status and valid transitions
|
|
38
|
+
|
|
39
|
+
## Test Cases
|
|
40
|
+
|
|
41
|
+
- throws when user does not exist
|
|
42
|
+
- throws when user is PENDING
|
|
43
|
+
- throws when user is already ACTIVE
|
|
44
|
+
- reactivates INACTIVE user to ACTIVE
|
|
@@ -38,3 +38,10 @@ flowchart TD
|
|
|
38
38
|
- **ROLE_NOT_FOUND**: Role ID does not exist in the system - return not found error with the provided role ID
|
|
39
39
|
- **PERMISSION_NOT_FOUND**: Permission ID does not exist in the system - return not found error with the provided permission ID
|
|
40
40
|
- **ASSIGNMENT_NOT_FOUND**: Role does not have this permission assigned - return not found error indicating the association does not exist
|
|
41
|
+
|
|
42
|
+
## Test Cases
|
|
43
|
+
|
|
44
|
+
- throws when role does not exist
|
|
45
|
+
- throws when permission does not exist
|
|
46
|
+
- throws when assignment does not exist
|
|
47
|
+
- deletes RolePermission
|
|
@@ -38,3 +38,10 @@ flowchart TD
|
|
|
38
38
|
- **USER_NOT_FOUND**: User ID does not exist in the system - return not found error with the provided user ID
|
|
39
39
|
- **ROLE_NOT_FOUND**: Role ID does not exist in the system - return not found error with the provided role ID
|
|
40
40
|
- **ASSIGNMENT_NOT_FOUND**: User does not have this role assigned - return not found error indicating the association does not exist
|
|
41
|
+
|
|
42
|
+
## Test Cases
|
|
43
|
+
|
|
44
|
+
- throws when user does not exist
|
|
45
|
+
- throws when role does not exist
|
|
46
|
+
- throws when assignment does not exist
|
|
47
|
+
- deletes UserRole and recomputes permissions
|
|
@@ -1,32 +1,2 @@
|
|
|
1
1
|
export { defineModule } from "./module";
|
|
2
2
|
export { permissions, own, all } from "./lib/permissions.generated";
|
|
3
|
-
|
|
4
|
-
// generated types
|
|
5
|
-
export { AuditEventEventType, UserStatus } from "./generated/enums";
|
|
6
|
-
|
|
7
|
-
// errors
|
|
8
|
-
export {
|
|
9
|
-
UserNotFoundError,
|
|
10
|
-
UserAlreadyExistsError,
|
|
11
|
-
UserNotActiveError,
|
|
12
|
-
InvalidEmailError,
|
|
13
|
-
MissingRequiredFieldError,
|
|
14
|
-
InvalidStatusTransitionError,
|
|
15
|
-
PermissionNotFoundError,
|
|
16
|
-
DuplicatePermissionKeyError,
|
|
17
|
-
InvalidPermissionKeyFormatError,
|
|
18
|
-
RoleNotFoundError,
|
|
19
|
-
DuplicateRoleNameError,
|
|
20
|
-
AssignmentNotFoundError,
|
|
21
|
-
InvalidEventTypeError,
|
|
22
|
-
} from "./lib/errors.generated";
|
|
23
|
-
|
|
24
|
-
// input types
|
|
25
|
-
export { type ActivateUserInput } from "./command/activateUser";
|
|
26
|
-
export { type DeactivateUserInput } from "./command/deactivateUser";
|
|
27
|
-
export { type ReactivateUserInput } from "./command/reactivateUser";
|
|
28
|
-
export { type AssignPermissionToRoleInput } from "./command/assignPermissionToRole";
|
|
29
|
-
export { type RevokePermissionFromRoleInput } from "./command/revokePermissionFromRole";
|
|
30
|
-
export { type AssignRoleToUserInput } from "./command/assignRoleToUser";
|
|
31
|
-
export { type RevokeRoleFromUserInput } from "./command/revokeRoleFromUser";
|
|
32
|
-
export { type LogAuditEventInput } from "./command/logAuditEvent";
|
|
@@ -1,67 +1,67 @@
|
|
|
1
1
|
// @generated — do not edit
|
|
2
|
-
import { createDomainError } from "
|
|
2
|
+
import { createDomainError } from "../../../shared";
|
|
3
3
|
|
|
4
4
|
export const UserNotFoundError = createDomainError(
|
|
5
|
-
"UserNotFoundError", "
|
|
5
|
+
"UserNotFoundError", "USER_MANAGEMENT_USER_NOT_FOUND",
|
|
6
6
|
(identifier: string) => `User ID does not exist in the system - return not found error with the provided ID: ${identifier}`,
|
|
7
7
|
);
|
|
8
8
|
|
|
9
9
|
export const InvalidStatusTransitionError = createDomainError(
|
|
10
|
-
"InvalidStatusTransitionError", "
|
|
10
|
+
"InvalidStatusTransitionError", "USER_MANAGEMENT_INVALID_STATUS_TRANSITION",
|
|
11
11
|
(identifier: string) => `User is not in PENDING status (already ACTIVE or INACTIVE) - return error with current status and valid transitions: ${identifier}`,
|
|
12
12
|
);
|
|
13
13
|
|
|
14
14
|
export const RoleNotFoundError = createDomainError(
|
|
15
|
-
"RoleNotFoundError", "
|
|
15
|
+
"RoleNotFoundError", "USER_MANAGEMENT_ROLE_NOT_FOUND",
|
|
16
16
|
(identifier: string) => `Role ID does not exist in the system - return not found error with the provided role ID: ${identifier}`,
|
|
17
17
|
);
|
|
18
18
|
|
|
19
19
|
export const PermissionNotFoundError = createDomainError(
|
|
20
|
-
"PermissionNotFoundError", "
|
|
20
|
+
"PermissionNotFoundError", "USER_MANAGEMENT_PERMISSION_NOT_FOUND",
|
|
21
21
|
(identifier: string) => `Permission ID does not exist in the system - return not found error with the provided permission ID: ${identifier}`,
|
|
22
22
|
);
|
|
23
23
|
|
|
24
24
|
export const UserNotActiveError = createDomainError(
|
|
25
|
-
"UserNotActiveError", "
|
|
25
|
+
"UserNotActiveError", "USER_MANAGEMENT_USER_NOT_ACTIVE",
|
|
26
26
|
(identifier: string) => `User is in PENDING or INACTIVE status - return error indicating only ACTIVE users can receive role assignments: ${identifier}`,
|
|
27
27
|
);
|
|
28
28
|
|
|
29
29
|
export const InvalidPermissionKeyFormatError = createDomainError(
|
|
30
|
-
"InvalidPermissionKeyFormatError", "
|
|
30
|
+
"InvalidPermissionKeyFormatError", "USER_MANAGEMENT_INVALID_PERMISSION_KEY_FORMAT",
|
|
31
31
|
(identifier: string) => `Key does not match resource:action pattern: ${identifier}`,
|
|
32
32
|
);
|
|
33
33
|
|
|
34
34
|
export const DuplicatePermissionKeyError = createDomainError(
|
|
35
|
-
"DuplicatePermissionKeyError", "
|
|
35
|
+
"DuplicatePermissionKeyError", "USER_MANAGEMENT_DUPLICATE_PERMISSION_KEY",
|
|
36
36
|
(identifier: string) => `Permission with the same key already exists: ${identifier}`,
|
|
37
37
|
);
|
|
38
38
|
|
|
39
39
|
export const MissingRequiredFieldError = createDomainError(
|
|
40
|
-
"MissingRequiredFieldError", "
|
|
40
|
+
"MissingRequiredFieldError", "USER_MANAGEMENT_MISSING_REQUIRED_FIELD",
|
|
41
41
|
(identifier: string) => `Role name not provided - return validation error indicating name is required: ${identifier}`,
|
|
42
42
|
);
|
|
43
43
|
|
|
44
44
|
export const DuplicateRoleNameError = createDomainError(
|
|
45
|
-
"DuplicateRoleNameError", "
|
|
45
|
+
"DuplicateRoleNameError", "USER_MANAGEMENT_DUPLICATE_ROLE_NAME",
|
|
46
46
|
(identifier: string) => `Role with the same name already exists: ${identifier}`,
|
|
47
47
|
);
|
|
48
48
|
|
|
49
49
|
export const UserAlreadyExistsError = createDomainError(
|
|
50
|
-
"UserAlreadyExistsError", "
|
|
50
|
+
"UserAlreadyExistsError", "USER_MANAGEMENT_USER_ALREADY_EXISTS",
|
|
51
51
|
(identifier: string) => `Email address is already registered in the system - return conflict error with message indicating email is taken: ${identifier}`,
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
export const InvalidEmailError = createDomainError(
|
|
55
|
-
"InvalidEmailError", "
|
|
55
|
+
"InvalidEmailError", "USER_MANAGEMENT_INVALID_EMAIL",
|
|
56
56
|
(identifier: string) => `Email does not follow valid email format - return validation error with format requirements: ${identifier}`,
|
|
57
57
|
);
|
|
58
58
|
|
|
59
59
|
export const InvalidEventTypeError = createDomainError(
|
|
60
|
-
"InvalidEventTypeError", "
|
|
60
|
+
"InvalidEventTypeError", "USER_MANAGEMENT_INVALID_EVENT_TYPE",
|
|
61
61
|
(identifier: string) => `Event type is not one of the recognized types - return validation error with list of valid event types: ${identifier}`,
|
|
62
62
|
);
|
|
63
63
|
|
|
64
64
|
export const AssignmentNotFoundError = createDomainError(
|
|
65
|
-
"AssignmentNotFoundError", "
|
|
65
|
+
"AssignmentNotFoundError", "USER_MANAGEMENT_ASSIGNMENT_NOT_FOUND",
|
|
66
66
|
(identifier: string) => `Role does not have this permission assigned - return not found error indicating the association does not exist: ${identifier}`,
|
|
67
67
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @generated — do not edit
|
|
2
|
-
import { definePermissions } from "
|
|
2
|
+
import { definePermissions } from "../../../shared";
|
|
3
3
|
|
|
4
4
|
export const { permissions, own, all } = definePermissions("user-management", [
|
|
5
5
|
"activateUser",
|
|
@@ -9,7 +9,6 @@ export const { permissions, own, all } = definePermissions("user-management", [
|
|
|
9
9
|
"createRole",
|
|
10
10
|
"createUser",
|
|
11
11
|
"deactivateUser",
|
|
12
|
-
"logAuditEvent",
|
|
13
12
|
"reactivateUser",
|
|
14
13
|
"revokePermissionFromRole",
|
|
15
14
|
"revokeRoleFromUser",
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type TailordbKysely } from "@tailor-platform/sdk/kysely";
|
|
2
|
+
import type { Transaction as KyselyTransaction } from "kysely";
|
|
2
3
|
import { DB } from "../generated/kysely-tailordb";
|
|
3
4
|
import { User } from "./types";
|
|
4
5
|
|
|
5
6
|
export const recomputeUserPermissions = async <
|
|
6
7
|
T extends { User: object; UserRole: object; RolePermission: object; Permission: object },
|
|
7
8
|
>(
|
|
8
|
-
db:
|
|
9
|
+
db: TailordbKysely<T> | KyselyTransaction<T>,
|
|
9
10
|
userId: string,
|
|
10
11
|
): Promise<User<T>> => {
|
|
11
12
|
const _db = db as unknown as DB;
|
|
@@ -33,7 +34,7 @@ export const recomputeUserPermissions = async <
|
|
|
33
34
|
export const recomputePermissionsForUsersWithRole = async <
|
|
34
35
|
T extends { User: object; UserRole: object; RolePermission: object; Permission: object },
|
|
35
36
|
>(
|
|
36
|
-
db:
|
|
37
|
+
db: TailordbKysely<T> | KyselyTransaction<T>,
|
|
37
38
|
roleId: string,
|
|
38
39
|
): Promise<User<T>[]> => {
|
|
39
40
|
const _db = db as unknown as DB;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InferSchema, Selectable, Insertable, Updateable } from "
|
|
1
|
+
import type { InferSchema, Selectable, Insertable, Updateable } from "../../../shared";
|
|
2
2
|
import type { DB } from "../generated/kysely-tailordb";
|
|
3
3
|
|
|
4
4
|
export type Schema = InferSchema<DB>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TailorAnyDBField } from "@tailor-platform/sdk";
|
|
2
|
-
import { type EmptyFields, type FieldsToInsertable } from "
|
|
2
|
+
import { type EmptyFields, type FieldsToInsertable } from "../../shared";
|
|
3
3
|
import { createUser } from "./command/createUser.generated";
|
|
4
4
|
import { createRole } from "./command/createRole.generated";
|
|
5
5
|
import { createPermission } from "./command/createPermission.generated";
|
|
@@ -10,8 +10,6 @@ import { assignPermissionToRole } from "./command/assignPermissionToRole.generat
|
|
|
10
10
|
import { revokePermissionFromRole } from "./command/revokePermissionFromRole.generated";
|
|
11
11
|
import { assignRoleToUser } from "./command/assignRoleToUser.generated";
|
|
12
12
|
import { revokeRoleFromUser } from "./command/revokeRoleFromUser.generated";
|
|
13
|
-
import { logAuditEvent } from "./command/logAuditEvent.generated";
|
|
14
|
-
import { createAuditEventType, CreateAuditEventTypeParams } from "./db/auditEvent";
|
|
15
13
|
import { createPermissionType, CreatePermissionTypeParams } from "./db/permission";
|
|
16
14
|
import { createRoleType, CreateRoleTypeParams } from "./db/role";
|
|
17
15
|
import { createRolePermissionType, CreateRolePermissionTypeParams } from "./db/rolePermission";
|
|
@@ -33,7 +31,6 @@ export interface DefineModuleParams<
|
|
|
33
31
|
role?: CreateRoleTypeParams<RF>;
|
|
34
32
|
userRole?: CreateUserRoleTypeParams;
|
|
35
33
|
rolePermission?: CreateRolePermissionTypeParams;
|
|
36
|
-
auditEvent?: CreateAuditEventTypeParams;
|
|
37
34
|
}
|
|
38
35
|
|
|
39
36
|
export const defineModule = <
|
|
@@ -48,7 +45,6 @@ export const defineModule = <
|
|
|
48
45
|
const role = createRoleType(params.role ?? {});
|
|
49
46
|
const userRole = createUserRoleType(params.userRole ?? {});
|
|
50
47
|
const rolePermission = createRolePermissionType(params.rolePermission ?? {});
|
|
51
|
-
const auditEvent = createAuditEventType(params.auditEvent ?? {});
|
|
52
48
|
|
|
53
49
|
const rolePermissionCreated = recomputeOnRolePermissionCreated({
|
|
54
50
|
namespace: params.dbNamespace,
|
|
@@ -58,7 +54,7 @@ export const defineModule = <
|
|
|
58
54
|
});
|
|
59
55
|
|
|
60
56
|
return {
|
|
61
|
-
db: { user, permission, role, userRole, rolePermission
|
|
57
|
+
db: { user, permission, role, userRole, rolePermission },
|
|
62
58
|
executors: { rolePermissionCreated, rolePermissionDeleted },
|
|
63
59
|
commands: {
|
|
64
60
|
createUser: createUser<FieldsToInsertable<UF>>(),
|
|
@@ -71,7 +67,6 @@ export const defineModule = <
|
|
|
71
67
|
revokePermissionFromRole: revokePermissionFromRole(),
|
|
72
68
|
assignRoleToUser: assignRoleToUser(),
|
|
73
69
|
revokeRoleFromUser: revokeRoleFromUser(),
|
|
74
|
-
logAuditEvent: logAuditEvent(),
|
|
75
70
|
},
|
|
76
71
|
};
|
|
77
72
|
};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { defineConfig,
|
|
1
|
+
import { defineConfig, definePlugins } from "@tailor-platform/sdk";
|
|
2
|
+
import { kyselyTypePlugin } from "@tailor-platform/sdk/plugin/kysely-type";
|
|
3
|
+
import { enumConstantsPlugin } from "@tailor-platform/sdk/plugin/enum-constants";
|
|
2
4
|
|
|
3
5
|
export default defineConfig({
|
|
4
6
|
name: "user-management",
|
|
5
7
|
db: { "main-db": { files: [`./db/*.ts`] } },
|
|
6
8
|
});
|
|
7
9
|
|
|
8
|
-
export const
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
export const plugins = definePlugins(
|
|
11
|
+
kyselyTypePlugin({ distPath: `./generated/kysely-tailordb.ts` }),
|
|
12
|
+
enumConstantsPlugin({ distPath: "./generated/enums.ts" }),
|
|
11
13
|
);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// This file is auto-generated by @tailor-platform/sdk
|
|
2
|
+
// Do not edit this file manually
|
|
3
|
+
// Regenerated automatically when running 'tailor-sdk apply' or 'tailor-sdk generate'
|
|
4
|
+
|
|
5
|
+
declare module "@tailor-platform/sdk" {
|
|
6
|
+
interface AttributeMap {}
|
|
7
|
+
interface AttributeList {
|
|
8
|
+
__tuple?: [];
|
|
9
|
+
}
|
|
10
|
+
interface Env {}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export {};
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AuditEvent,
|
|
3
|
-
Permission,
|
|
4
|
-
Role,
|
|
5
|
-
RolePermission,
|
|
6
|
-
Schema,
|
|
7
|
-
User,
|
|
8
|
-
UserRole,
|
|
9
|
-
} from "../lib/types";
|
|
1
|
+
import type { Permission, Role, RolePermission, Schema, User, UserRole } from "../lib/types";
|
|
10
2
|
|
|
11
3
|
export const pendingUser = {
|
|
12
4
|
id: "user-pending-1",
|
|
@@ -85,14 +77,3 @@ export const baseRolePermission = {
|
|
|
85
77
|
createdAt: new Date("2024-01-01T00:00:00.000Z"),
|
|
86
78
|
updatedAt: null,
|
|
87
79
|
} as const satisfies RolePermission<Schema>;
|
|
88
|
-
|
|
89
|
-
export const baseAuditEvent = {
|
|
90
|
-
id: "audit-event-1",
|
|
91
|
-
eventType: "USER_CREATED",
|
|
92
|
-
actorId: "user-active-1",
|
|
93
|
-
targetId: "user-pending-1",
|
|
94
|
-
targetType: "User",
|
|
95
|
-
payload: JSON.stringify({ email: "pending@example.com" }),
|
|
96
|
-
createdAt: new Date("2024-01-01T00:00:00.000Z"),
|
|
97
|
-
updatedAt: null,
|
|
98
|
-
} as const satisfies AuditEvent<Schema>;
|
package/src/schemas.ts
CHANGED
|
@@ -12,7 +12,7 @@ export const MODULE_SCHEMAS = {
|
|
|
12
12
|
} as const;
|
|
13
13
|
|
|
14
14
|
export const APP_COMPOSE_SCHEMAS = {
|
|
15
|
-
|
|
15
|
+
app: path.join(SCHEMAS_ROOT, "app-compose", "requirements.yml"),
|
|
16
16
|
actors: path.join(SCHEMAS_ROOT, "app-compose", "actors.yml"),
|
|
17
17
|
"business-flow": path.join(SCHEMAS_ROOT, "app-compose", "business-flow.yml"),
|
|
18
18
|
story: path.join(SCHEMAS_ROOT, "app-compose", "story.yml"),
|