@mytechtoday/augment-extensions 0.1.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
# PHP E-commerce Development Best Practices
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides best practices for developing e-commerce systems in PHP, including shopping cart management, payment gateway integration, order processing, WooCommerce development, and PCI DSS compliance.
|
|
6
|
+
|
|
7
|
+
## Shopping Cart Management
|
|
8
|
+
|
|
9
|
+
### Cart Session Handling
|
|
10
|
+
|
|
11
|
+
```php
|
|
12
|
+
<?php
|
|
13
|
+
|
|
14
|
+
namespace App\Services;
|
|
15
|
+
|
|
16
|
+
class CartService
|
|
17
|
+
{
|
|
18
|
+
private $session;
|
|
19
|
+
|
|
20
|
+
public function __construct(SessionInterface $session)
|
|
21
|
+
{
|
|
22
|
+
$this->session = $session;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public function addItem(int $productId, int $quantity = 1, array $options = []): void
|
|
26
|
+
{
|
|
27
|
+
$cart = $this->getCart();
|
|
28
|
+
|
|
29
|
+
$itemKey = $this->generateItemKey($productId, $options);
|
|
30
|
+
|
|
31
|
+
if (isset($cart[$itemKey])) {
|
|
32
|
+
$cart[$itemKey]['quantity'] += $quantity;
|
|
33
|
+
} else {
|
|
34
|
+
$cart[$itemKey] = [
|
|
35
|
+
'product_id' => $productId,
|
|
36
|
+
'quantity' => $quantity,
|
|
37
|
+
'options' => $options,
|
|
38
|
+
'added_at' => time()
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
$this->saveCart($cart);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public function removeItem(string $itemKey): void
|
|
46
|
+
{
|
|
47
|
+
$cart = $this->getCart();
|
|
48
|
+
unset($cart[$itemKey]);
|
|
49
|
+
$this->saveCart($cart);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public function updateQuantity(string $itemKey, int $quantity): void
|
|
53
|
+
{
|
|
54
|
+
$cart = $this->getCart();
|
|
55
|
+
|
|
56
|
+
if ($quantity <= 0) {
|
|
57
|
+
$this->removeItem($itemKey);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (isset($cart[$itemKey])) {
|
|
62
|
+
$cart[$itemKey]['quantity'] = $quantity;
|
|
63
|
+
$this->saveCart($cart);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public function getCart(): array
|
|
68
|
+
{
|
|
69
|
+
return $this->session->get('cart', []);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public function clear(): void
|
|
73
|
+
{
|
|
74
|
+
$this->session->remove('cart');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public function getTotal(): float
|
|
78
|
+
{
|
|
79
|
+
$cart = $this->getCart();
|
|
80
|
+
$total = 0.0;
|
|
81
|
+
|
|
82
|
+
foreach ($cart as $item) {
|
|
83
|
+
$product = Product::find($item['product_id']);
|
|
84
|
+
$total += $product->price * $item['quantity'];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return $total;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private function generateItemKey(int $productId, array $options): string
|
|
91
|
+
{
|
|
92
|
+
ksort($options);
|
|
93
|
+
return md5($productId . json_encode($options));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private function saveCart(array $cart): void
|
|
97
|
+
{
|
|
98
|
+
$this->session->put('cart', $cart);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Stock Validation
|
|
104
|
+
|
|
105
|
+
```php
|
|
106
|
+
<?php
|
|
107
|
+
|
|
108
|
+
class StockValidator
|
|
109
|
+
{
|
|
110
|
+
public function validateCartStock(array $cart): array
|
|
111
|
+
{
|
|
112
|
+
$errors = [];
|
|
113
|
+
|
|
114
|
+
foreach ($cart as $itemKey => $item) {
|
|
115
|
+
$product = Product::find($item['product_id']);
|
|
116
|
+
|
|
117
|
+
if (!$product) {
|
|
118
|
+
$errors[$itemKey] = 'Product not found';
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (!$product->is_available) {
|
|
123
|
+
$errors[$itemKey] = 'Product is no longer available';
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if ($product->stock < $item['quantity']) {
|
|
128
|
+
$errors[$itemKey] = "Only {$product->stock} items available";
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return $errors;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public function reserveStock(Order $order): void
|
|
136
|
+
{
|
|
137
|
+
DB::transaction(function () use ($order) {
|
|
138
|
+
foreach ($order->items as $item) {
|
|
139
|
+
$product = Product::lockForUpdate()->find($item->product_id);
|
|
140
|
+
|
|
141
|
+
if ($product->stock < $item->quantity) {
|
|
142
|
+
throw new InsufficientStockException(
|
|
143
|
+
"Insufficient stock for product: {$product->name}"
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
$product->decrement('stock', $item->quantity);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Payment Gateway Integration
|
|
155
|
+
|
|
156
|
+
### Payment Interface
|
|
157
|
+
|
|
158
|
+
```php
|
|
159
|
+
<?php
|
|
160
|
+
|
|
161
|
+
namespace App\Payments;
|
|
162
|
+
|
|
163
|
+
interface PaymentGatewayInterface
|
|
164
|
+
{
|
|
165
|
+
public function charge(float $amount, string $currency, array $paymentMethod): PaymentResult;
|
|
166
|
+
public function refund(string $transactionId, float $amount): RefundResult;
|
|
167
|
+
public function getTransaction(string $transactionId): Transaction;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
class PaymentResult
|
|
171
|
+
{
|
|
172
|
+
public function __construct(
|
|
173
|
+
public bool $success,
|
|
174
|
+
public ?string $transactionId,
|
|
175
|
+
public ?string $errorMessage = null
|
|
176
|
+
) {}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Stripe Integration
|
|
181
|
+
|
|
182
|
+
```php
|
|
183
|
+
<?php
|
|
184
|
+
|
|
185
|
+
namespace App\Payments;
|
|
186
|
+
|
|
187
|
+
use Stripe\StripeClient;
|
|
188
|
+
use Stripe\Exception\ApiErrorException;
|
|
189
|
+
|
|
190
|
+
class StripeGateway implements PaymentGatewayInterface
|
|
191
|
+
{
|
|
192
|
+
private StripeClient $stripe;
|
|
193
|
+
|
|
194
|
+
public function __construct(string $apiKey)
|
|
195
|
+
{
|
|
196
|
+
$this->stripe = new StripeClient($apiKey);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
public function charge(float $amount, string $currency, array $paymentMethod): PaymentResult
|
|
200
|
+
{
|
|
201
|
+
try {
|
|
202
|
+
$intent = $this->stripe->paymentIntents->create([
|
|
203
|
+
'amount' => (int)($amount * 100), // Convert to cents
|
|
204
|
+
'currency' => $currency,
|
|
205
|
+
'payment_method' => $paymentMethod['id'],
|
|
206
|
+
'confirm' => true,
|
|
207
|
+
'metadata' => [
|
|
208
|
+
'order_id' => $paymentMethod['order_id'] ?? null
|
|
209
|
+
]
|
|
210
|
+
]);
|
|
211
|
+
|
|
212
|
+
return new PaymentResult(
|
|
213
|
+
success: $intent->status === 'succeeded',
|
|
214
|
+
transactionId: $intent->id
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
} catch (ApiErrorException $e) {
|
|
218
|
+
return new PaymentResult(
|
|
219
|
+
success: false,
|
|
220
|
+
transactionId: null,
|
|
221
|
+
errorMessage: $e->getMessage()
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
public function refund(string $transactionId, float $amount): RefundResult
|
|
227
|
+
{
|
|
228
|
+
try {
|
|
229
|
+
$refund = $this->stripe->refunds->create([
|
|
230
|
+
'payment_intent' => $transactionId,
|
|
231
|
+
'amount' => (int)($amount * 100)
|
|
232
|
+
]);
|
|
233
|
+
|
|
234
|
+
return new RefundResult(
|
|
235
|
+
success: $refund->status === 'succeeded',
|
|
236
|
+
refundId: $refund->id
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
} catch (ApiErrorException $e) {
|
|
240
|
+
return new RefundResult(
|
|
241
|
+
success: false,
|
|
242
|
+
refundId: null,
|
|
243
|
+
errorMessage: $e->getMessage()
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Secure Payment Token Handling
|
|
251
|
+
|
|
252
|
+
```php
|
|
253
|
+
<?php
|
|
254
|
+
|
|
255
|
+
class PaymentTokenService
|
|
256
|
+
{
|
|
257
|
+
public function tokenizeCard(array $cardData): string
|
|
258
|
+
{
|
|
259
|
+
// NEVER store raw card data
|
|
260
|
+
// Use payment gateway's tokenization
|
|
261
|
+
|
|
262
|
+
$token = $this->paymentGateway->createToken([
|
|
263
|
+
'card' => [
|
|
264
|
+
'number' => $cardData['number'],
|
|
265
|
+
'exp_month' => $cardData['exp_month'],
|
|
266
|
+
'exp_year' => $cardData['exp_year'],
|
|
267
|
+
'cvc' => $cardData['cvc']
|
|
268
|
+
]
|
|
269
|
+
]);
|
|
270
|
+
|
|
271
|
+
// Store only the token, never the card details
|
|
272
|
+
return $token->id;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
public function chargeToken(string $token, float $amount): PaymentResult
|
|
276
|
+
{
|
|
277
|
+
return $this->paymentGateway->charge($amount, 'usd', [
|
|
278
|
+
'id' => $token
|
|
279
|
+
]);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Order Processing
|
|
285
|
+
|
|
286
|
+
### Order Creation with Transactions
|
|
287
|
+
|
|
288
|
+
```php
|
|
289
|
+
<?php
|
|
290
|
+
|
|
291
|
+
namespace App\Services;
|
|
292
|
+
|
|
293
|
+
use Illuminate\Support\Facades\DB;
|
|
294
|
+
|
|
295
|
+
class OrderService
|
|
296
|
+
{
|
|
297
|
+
public function createOrder(array $cartItems, array $customerData, array $paymentData): Order
|
|
298
|
+
{
|
|
299
|
+
return DB::transaction(function () use ($cartItems, $customerData, $paymentData) {
|
|
300
|
+
// 1. Create order
|
|
301
|
+
$order = Order::create([
|
|
302
|
+
'customer_id' => $customerData['customer_id'],
|
|
303
|
+
'status' => 'pending',
|
|
304
|
+
'subtotal' => $this->calculateSubtotal($cartItems),
|
|
305
|
+
'tax' => $this->calculateTax($cartItems),
|
|
306
|
+
'shipping' => $this->calculateShipping($cartItems),
|
|
307
|
+
'total' => $this->calculateTotal($cartItems)
|
|
308
|
+
]);
|
|
309
|
+
|
|
310
|
+
// 2. Create order items
|
|
311
|
+
foreach ($cartItems as $item) {
|
|
312
|
+
$product = Product::lockForUpdate()->find($item['product_id']);
|
|
313
|
+
|
|
314
|
+
// Validate stock
|
|
315
|
+
if ($product->stock < $item['quantity']) {
|
|
316
|
+
throw new InsufficientStockException();
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Create order item
|
|
320
|
+
$order->items()->create([
|
|
321
|
+
'product_id' => $product->id,
|
|
322
|
+
'quantity' => $item['quantity'],
|
|
323
|
+
'price' => $product->price,
|
|
324
|
+
'total' => $product->price * $item['quantity']
|
|
325
|
+
]);
|
|
326
|
+
|
|
327
|
+
// Decrement stock
|
|
328
|
+
$product->decrement('stock', $item['quantity']);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// 3. Process payment
|
|
332
|
+
$paymentResult = $this->paymentGateway->charge(
|
|
333
|
+
$order->total,
|
|
334
|
+
'usd',
|
|
335
|
+
$paymentData
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
if (!$paymentResult->success) {
|
|
339
|
+
throw new PaymentFailedException($paymentResult->errorMessage);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// 4. Update order with payment info
|
|
343
|
+
$order->update([
|
|
344
|
+
'status' => 'paid',
|
|
345
|
+
'transaction_id' => $paymentResult->transactionId,
|
|
346
|
+
'paid_at' => now()
|
|
347
|
+
]);
|
|
348
|
+
|
|
349
|
+
// 5. Send confirmation email
|
|
350
|
+
$this->sendOrderConfirmation($order);
|
|
351
|
+
|
|
352
|
+
return $order;
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## WooCommerce Development
|
|
359
|
+
|
|
360
|
+
### Custom Product Type
|
|
361
|
+
|
|
362
|
+
```php
|
|
363
|
+
<?php
|
|
364
|
+
|
|
365
|
+
class WC_Product_Custom extends WC_Product
|
|
366
|
+
{
|
|
367
|
+
public function __construct($product = 0)
|
|
368
|
+
{
|
|
369
|
+
$this->product_type = 'custom';
|
|
370
|
+
parent::__construct($product);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
public function get_type()
|
|
374
|
+
{
|
|
375
|
+
return 'custom';
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
public function is_purchasable()
|
|
379
|
+
{
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Register product type
|
|
385
|
+
add_filter('product_type_selector', 'add_custom_product_type');
|
|
386
|
+
function add_custom_product_type($types)
|
|
387
|
+
{
|
|
388
|
+
$types['custom'] = __('Custom Product', 'woocommerce');
|
|
389
|
+
return $types;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
add_filter('woocommerce_product_class', 'custom_product_class', 10, 2);
|
|
393
|
+
function custom_product_class($classname, $product_type)
|
|
394
|
+
{
|
|
395
|
+
if ($product_type === 'custom') {
|
|
396
|
+
$classname = 'WC_Product_Custom';
|
|
397
|
+
}
|
|
398
|
+
return $classname;
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### WooCommerce Hooks
|
|
403
|
+
|
|
404
|
+
```php
|
|
405
|
+
<?php
|
|
406
|
+
|
|
407
|
+
// Modify cart item price
|
|
408
|
+
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price');
|
|
409
|
+
function custom_cart_item_price($cart)
|
|
410
|
+
{
|
|
411
|
+
if (is_admin() && !defined('DOING_AJAX')) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
foreach ($cart->get_cart() as $cart_item) {
|
|
416
|
+
if (isset($cart_item['custom_price'])) {
|
|
417
|
+
$cart_item['data']->set_price($cart_item['custom_price']);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Add custom order meta
|
|
423
|
+
add_action('woocommerce_checkout_create_order', 'save_custom_order_meta', 10, 2);
|
|
424
|
+
function save_custom_order_meta($order, $data)
|
|
425
|
+
{
|
|
426
|
+
if (isset($_POST['custom_field'])) {
|
|
427
|
+
$order->update_meta_data(
|
|
428
|
+
'_custom_field',
|
|
429
|
+
sanitize_text_field($_POST['custom_field'])
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Validate checkout fields
|
|
435
|
+
add_action('woocommerce_after_checkout_validation', 'custom_checkout_validation', 10, 2);
|
|
436
|
+
function custom_checkout_validation($data, $errors)
|
|
437
|
+
{
|
|
438
|
+
if (empty($_POST['custom_field'])) {
|
|
439
|
+
$errors->add('validation', __('Custom field is required', 'woocommerce'));
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Modify order status
|
|
444
|
+
add_action('woocommerce_order_status_completed', 'custom_order_completed');
|
|
445
|
+
function custom_order_completed($order_id)
|
|
446
|
+
{
|
|
447
|
+
$order = wc_get_order($order_id);
|
|
448
|
+
|
|
449
|
+
// Send custom notification
|
|
450
|
+
// Award loyalty points
|
|
451
|
+
// Update inventory
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Payment Gateway Extension
|
|
456
|
+
|
|
457
|
+
```php
|
|
458
|
+
<?php
|
|
459
|
+
|
|
460
|
+
class WC_Gateway_Custom extends WC_Payment_Gateway
|
|
461
|
+
{
|
|
462
|
+
public function __construct()
|
|
463
|
+
{
|
|
464
|
+
$this->id = 'custom_gateway';
|
|
465
|
+
$this->method_title = __('Custom Gateway', 'woocommerce');
|
|
466
|
+
$this->method_description = __('Custom payment gateway', 'woocommerce');
|
|
467
|
+
$this->has_fields = true;
|
|
468
|
+
|
|
469
|
+
$this->init_form_fields();
|
|
470
|
+
$this->init_settings();
|
|
471
|
+
|
|
472
|
+
$this->title = $this->get_option('title');
|
|
473
|
+
$this->description = $this->get_option('description');
|
|
474
|
+
|
|
475
|
+
add_action('woocommerce_update_options_payment_gateways_' . $this->id, [$this, 'process_admin_options']);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
public function init_form_fields()
|
|
479
|
+
{
|
|
480
|
+
$this->form_fields = [
|
|
481
|
+
'enabled' => [
|
|
482
|
+
'title' => __('Enable/Disable', 'woocommerce'),
|
|
483
|
+
'type' => 'checkbox',
|
|
484
|
+
'label' => __('Enable Custom Gateway', 'woocommerce'),
|
|
485
|
+
'default' => 'no'
|
|
486
|
+
],
|
|
487
|
+
'title' => [
|
|
488
|
+
'title' => __('Title', 'woocommerce'),
|
|
489
|
+
'type' => 'text',
|
|
490
|
+
'default' => __('Custom Payment', 'woocommerce')
|
|
491
|
+
],
|
|
492
|
+
'api_key' => [
|
|
493
|
+
'title' => __('API Key', 'woocommerce'),
|
|
494
|
+
'type' => 'password'
|
|
495
|
+
]
|
|
496
|
+
];
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
public function process_payment($order_id)
|
|
500
|
+
{
|
|
501
|
+
$order = wc_get_order($order_id);
|
|
502
|
+
|
|
503
|
+
try {
|
|
504
|
+
// Process payment
|
|
505
|
+
$result = $this->gateway->charge(
|
|
506
|
+
$order->get_total(),
|
|
507
|
+
$order->get_currency(),
|
|
508
|
+
$_POST['payment_token']
|
|
509
|
+
);
|
|
510
|
+
|
|
511
|
+
if ($result->success) {
|
|
512
|
+
$order->payment_complete($result->transactionId);
|
|
513
|
+
|
|
514
|
+
return [
|
|
515
|
+
'result' => 'success',
|
|
516
|
+
'redirect' => $this->get_return_url($order)
|
|
517
|
+
];
|
|
518
|
+
} else {
|
|
519
|
+
wc_add_notice($result->errorMessage, 'error');
|
|
520
|
+
return ['result' => 'failure'];
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
} catch (\Exception $e) {
|
|
524
|
+
wc_add_notice(__('Payment error:', 'woocommerce') . ' ' . $e->getMessage(), 'error');
|
|
525
|
+
return ['result' => 'failure'];
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Register gateway
|
|
531
|
+
add_filter('woocommerce_payment_gateways', 'add_custom_gateway');
|
|
532
|
+
function add_custom_gateway($gateways)
|
|
533
|
+
{
|
|
534
|
+
$gateways[] = 'WC_Gateway_Custom';
|
|
535
|
+
return $gateways;
|
|
536
|
+
}
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
## PCI DSS Compliance
|
|
540
|
+
|
|
541
|
+
### Security Requirements
|
|
542
|
+
|
|
543
|
+
```php
|
|
544
|
+
<?php
|
|
545
|
+
|
|
546
|
+
// ❌ NEVER do this - storing card data
|
|
547
|
+
class BadExample
|
|
548
|
+
{
|
|
549
|
+
public function saveCard($cardNumber, $cvv, $expiry)
|
|
550
|
+
{
|
|
551
|
+
// NEVER STORE CARD DATA IN YOUR DATABASE
|
|
552
|
+
DB::table('cards')->insert([
|
|
553
|
+
'card_number' => $cardNumber, // ❌ VIOLATION
|
|
554
|
+
'cvv' => $cvv, // ❌ VIOLATION
|
|
555
|
+
'expiry' => $expiry
|
|
556
|
+
]);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// ✅ Correct approach - use tokenization
|
|
561
|
+
class GoodExample
|
|
562
|
+
{
|
|
563
|
+
public function savePaymentMethod($customerId, $cardData)
|
|
564
|
+
{
|
|
565
|
+
// Use payment gateway's tokenization
|
|
566
|
+
$token = $this->stripe->tokens->create([
|
|
567
|
+
'card' => $cardData
|
|
568
|
+
]);
|
|
569
|
+
|
|
570
|
+
// Store only the token
|
|
571
|
+
DB::table('payment_methods')->insert([
|
|
572
|
+
'customer_id' => $customerId,
|
|
573
|
+
'token' => $token->id, // ✅ Safe to store
|
|
574
|
+
'last4' => $token->card->last4,
|
|
575
|
+
'brand' => $token->card->brand,
|
|
576
|
+
'exp_month' => $token->card->exp_month,
|
|
577
|
+
'exp_year' => $token->card->exp_year
|
|
578
|
+
]);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
## Best Practices
|
|
584
|
+
|
|
585
|
+
### ✅ DO
|
|
586
|
+
|
|
587
|
+
- Use database transactions for order processing
|
|
588
|
+
- Validate stock before order creation
|
|
589
|
+
- Use payment gateway tokenization
|
|
590
|
+
- Implement idempotent order processing
|
|
591
|
+
- Log all payment transactions
|
|
592
|
+
- Send order confirmation emails
|
|
593
|
+
- Implement proper error handling
|
|
594
|
+
- Use HTTPS for all payment pages
|
|
595
|
+
- Validate all input data
|
|
596
|
+
- Implement rate limiting on checkout
|
|
597
|
+
- Use pessimistic locking for stock updates
|
|
598
|
+
- Follow PCI DSS compliance guidelines
|
|
599
|
+
|
|
600
|
+
### ❌ DON'T
|
|
601
|
+
|
|
602
|
+
- Store raw credit card data
|
|
603
|
+
- Process payments without validation
|
|
604
|
+
- Skip stock validation
|
|
605
|
+
- Ignore transaction failures
|
|
606
|
+
- Expose payment errors to users
|
|
607
|
+
- Use GET requests for payment processing
|
|
608
|
+
- Store CVV codes
|
|
609
|
+
- Hardcode payment credentials
|
|
610
|
+
- Skip order confirmation emails
|
|
611
|
+
- Allow negative stock values
|
|
612
|
+
|
|
613
|
+
## Security Checklist
|
|
614
|
+
|
|
615
|
+
- [ ] HTTPS enforced on all pages
|
|
616
|
+
- [ ] Payment data tokenized (never stored)
|
|
617
|
+
- [ ] PCI DSS compliance verified
|
|
618
|
+
- [ ] Input validation on all fields
|
|
619
|
+
- [ ] CSRF protection on checkout
|
|
620
|
+
- [ ] Rate limiting on payment endpoints
|
|
621
|
+
- [ ] Secure session management
|
|
622
|
+
- [ ] SQL injection prevention
|
|
623
|
+
- [ ] XSS prevention
|
|
624
|
+
- [ ] Proper error handling (no sensitive data exposure)
|
|
625
|
+
- [ ] Transaction logging
|
|
626
|
+
- [ ] Fraud detection implemented
|
|
627
|
+
|