commit f5ff279b7bcdcdd4d5e8356247a8269069f4c9fa Author: Haylan Date: Mon Sep 14 19:17:26 2026 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f54b986 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# PHP +vendor/ +composer.phar +.phpunit.result.cache +.phpunit.cache/ +.php-cs-fixer.cache + +# Symfony / Shopware +/var/ +/public/bundles/ +/public/assets/ +/custom/ +/src/Shopware/Platform + +# Environment +.env +.env.local +.env.*.local + +# Agent skills (symlinked via skills.sh, tracked through skills-lock.json) +/.agents/ +/.claude/ +/.qwen/ +/.opencode/ + +# IDE +.idea/ +.vscode/ +*.swp + +# OS +.DS_Store +Thumbs.db diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..9d7c2ac --- /dev/null +++ b/composer.json @@ -0,0 +1,65 @@ +{ + "name": "aeon/dump-manager", + "description": "Export database dumps for Shopware 6 environments.", + "type": "shopware-platform-plugin", + "license": "MIT", + "version": "0.0.1", + "keywords": [ + "shopware", + "shopware6", + "plugin", + "dump", + "database", + "developer-tools" + ], + "homepage": "https://git.arthurerlich.de/haylan/AeonDumpManager", + "authors": [ + { + "name": "Arthur Erlich", + "homepage": "https://arthurerlich.de", + "role": "Developer" + } + ], + "support": { + "issues": "https://git.arthurerlich.de/haylan/AeonDumpManager/issues", + "source": "https://git.arthurerlich.de/haylan/AeonDumpManager" + }, + "require": { + "php": "^8.1", + "shopware/core": "~6.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "extra": { + "shopware-plugin-class": "AeonDumpManager\\AeonDumpManager", + "copyright": "(c) by Arthur Erlich", + "label": { + "de-DE": "Aeon Dump Manager", + "en-GB": "Aeon Dump Manager" + }, + "description": { + "de-DE": "Verwaltet Datenbank-Dumps für Shopware 6 Entwicklungsumgebungen.", + "en-GB": "Manages database dumps for Shopware 6 development environments." + }, + "manufacturerLink": { + "de-DE": "https://arthurerlich.de", + "en-GB": "https://arthurerlich.de" + }, + "supportLink": { + "de-DE": "https://git.arthurerlich.de/haylan/AeonDumpManager/issues", + "en-GB": "https://git.arthurerlich.de/haylan/AeonDumpManager/issues" + } + }, + "autoload": { + "psr-4": { + "AeonDumpManager\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "AeonDumpManager\\Tests\\": "tests/" + } + }, + "minimum-stability": "stable" +} \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..80ac7e0 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,23 @@ + + + + + ./src/ + + + + + + + + + + + + tests + + + diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 0000000..f27b69a --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,269 @@ +{ + "version": 1, + "skills": { + "symfony:api-platform-dto-resources": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-dto-resources/SKILL.md", + "computedHash": "0b5a49ef3b26381320570fc65262fe60f467869af7e9f34ea4b0f48762af2512" + }, + "symfony:api-platform-filters": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-filters/SKILL.md", + "computedHash": "b0a911aeb39f7e9788470356ebbab960d2a025da92452ee508e67192a387d020" + }, + "symfony:api-platform-resources": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-resources/SKILL.md", + "computedHash": "5d313ce0217ef198c5543728c4d0672c48fe1e9f0f0ffe8ae89e07c5c3cf30fb" + }, + "symfony:api-platform-security": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-security/SKILL.md", + "computedHash": "0c7a91b33c470450a699940c083cccea5256ea28a83b4a0acffd8575fedee4ec" + }, + "symfony:api-platform-serialization": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-serialization/SKILL.md", + "computedHash": "658ead8e467c493e429e39f4ff5465ecece42fdb49a2abbba708fd42535d4223" + }, + "symfony:api-platform-state-providers": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-state-providers/SKILL.md", + "computedHash": "2ef06b1eba9cc3619d3d50bb5c48f313d0d864d1cd18fef3767d5e3e705a8706" + }, + "symfony:api-platform-tests": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-tests/SKILL.md", + "computedHash": "351654fffb8b216acca349ff18053f4fdfba630f1678f8827a7ab3faeea258c8" + }, + "symfony:api-platform-versioning": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/api-platform-versioning/SKILL.md", + "computedHash": "0249c23a63075fb29bea006561b873f56530838505cc6c2d56c6c75b0630271a" + }, + "symfony:bootstrap-check": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/bootstrap-check/SKILL.md", + "computedHash": "b0770d00e974d3077f0dbab3aaab5b644a67cce72f099a9363fd68a6e7262b43" + }, + "symfony:brainstorming": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/brainstorming/SKILL.md", + "computedHash": "33d085759b6c70252df183c9589e86d1819807b371d3cbc08a7629469dc5b024" + }, + "symfony:config-env-parameters": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/config-env-parameters/SKILL.md", + "computedHash": "29c30ab73cf591f6940991e1e297836499e1760d390d0fea4faffbf9bc0d42d0" + }, + "symfony:controller-cleanup": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/controller-cleanup/SKILL.md", + "computedHash": "e581ac4fa9f7e59035e17a96cdb306ae6fb4c1fe2bb2ddea75fbc8b3c61b7a7f" + }, + "symfony:cqrs-and-handlers": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/cqrs-and-handlers/SKILL.md", + "computedHash": "eae9fd4fb0ba0e470e460c5bd5c64064a4a06b64b52398d199c54eb58fe283bc" + }, + "symfony:daily-workflow": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/daily-workflow/SKILL.md", + "computedHash": "de275687dca8eaec1c7f28f395494585a6ebb56dd2fcadfce16ccd9730db3ab2" + }, + "symfony:doctrine-batch-processing": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-batch-processing/SKILL.md", + "computedHash": "1c25ad982501efe1e1284f94e89661e83eaf67e60f6e9a86e021c2c8b8c65885" + }, + "symfony:doctrine-events": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-events/SKILL.md", + "computedHash": "0543f6b3a9077b53624fb034cf88a5aadc57e14b37138c82beaa13fdad155fe9" + }, + "symfony:doctrine-fetch-modes": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-fetch-modes/SKILL.md", + "computedHash": "8020117b42ddc00e9165ca9cf9cd7e1e2d0cf688fb5fdd10a82b05a91bd0fe5e" + }, + "symfony:doctrine-fixtures-foundry": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-fixtures-foundry/SKILL.md", + "computedHash": "dbaa95893400a1be733ff779539986ba52fdd8431e9c5298fcaad1d69c9053a7" + }, + "symfony:doctrine-migrations": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-migrations/SKILL.md", + "computedHash": "f567cc35a98fe8ac6e6632d4da5990f974d4028c9517672586c42a3528861425" + }, + "symfony:doctrine-relations": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-relations/SKILL.md", + "computedHash": "cecba41492de5efed7b2b0d53c3d198c79c063d5232e18e3ce7b6342cecac69d" + }, + "symfony:doctrine-transactions": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/doctrine-transactions/SKILL.md", + "computedHash": "1682b0b3fa1dc53db39471751467528d132bd72842b9d9e5d4c1dcb28bfcd1a2" + }, + "symfony:e2e-panther-playwright": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/e2e-panther-playwright/SKILL.md", + "computedHash": "37071992ee5e27b3c0922f509d1ff0708912ec17f9149e81f4befd2f7d246284" + }, + "symfony:effective-context": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/effective-context/SKILL.md", + "computedHash": "1e5fa157148bde5a3e48b7f2c275880e915781e43667d8b621cc1acdcafd04d9" + }, + "symfony:executing-plans": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/executing-plans/SKILL.md", + "computedHash": "deff91ba8c9c68e7f1b63ae9c91638ebe14e63e9503cb48303a5e1aa0edea288" + }, + "symfony:form-types-validation": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/form-types-validation/SKILL.md", + "computedHash": "3c1264ac1883e8d332181128b9bf620ed32ddd443ade6c42abc35eee178dfd03" + }, + "symfony:functional-tests": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/functional-tests/SKILL.md", + "computedHash": "fe487c7a86acc172e4d2d9130d04f7377f3950ce654d095f64a25829b9811435" + }, + "symfony:interfaces-and-autowiring": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/interfaces-and-autowiring/SKILL.md", + "computedHash": "18efd79e2b99806aaf7e3311391191e3041fede2e347d474a3c592af5b6e43e7" + }, + "symfony:messenger-retry-failures": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/messenger-retry-failures/SKILL.md", + "computedHash": "760b7115b9c1c7c4ec0042b21d91bdd6a58ba9b451452485eae71e5057332e29" + }, + "symfony:ports-and-adapters": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/ports-and-adapters/SKILL.md", + "computedHash": "e426df4395f29814ab6e89b703cd961c303958c4a832a575550e563d1cf8300c" + }, + "symfony:quality-checks": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/quality-checks/SKILL.md", + "computedHash": "603a2a61a4515727f2de2a93d5ef7fcc6bb24da6b3d096f58724b81f18b437a4" + }, + "symfony:rate-limiting": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/rate-limiting/SKILL.md", + "computedHash": "061cdadeb1e21fb322712c9951a2dc09acc8613376faf1002951b151d7369862" + }, + "symfony:runner-selection": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/runner-selection/SKILL.md", + "computedHash": "238744ad7e55f67f29e3e0de838e8d675e4cf51a58fddc2056b0bf27b43c2b5d" + }, + "symfony:strategy-pattern": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/strategy-pattern/SKILL.md", + "computedHash": "fe487cd678da11650e325c8f28b29a81e84b4938cfe4e42641b68c7bb622d377" + }, + "symfony:symfony-cache": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/symfony-cache/SKILL.md", + "computedHash": "92bfade421c2190100ba603b9d0d05d260594be3b4725ba98a9c8963433d7a97" + }, + "symfony:symfony-messenger": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/symfony-messenger/SKILL.md", + "computedHash": "4f7d3772433a2a03d570a3957d0a84f7f3d86782b273c14a8a75dae3aceb1e4d" + }, + "symfony:symfony-scheduler": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/symfony-scheduler/SKILL.md", + "computedHash": "8978979cf09c166b3a68dc6f64f47f38ce805ef654f55c3e913e41fbee502096" + }, + "symfony:symfony-voters": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/symfony-voters/SKILL.md", + "computedHash": "c9e782244caedf9787041d001ba90383b02a6a0e03f4645a699f6cbc204637f6" + }, + "symfony:tdd-with-pest": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/tdd-with-pest/SKILL.md", + "computedHash": "c5eb112bf920982639a4ad5b5eec8341a97c31fa6d693b94cc28eb5ed01e6667" + }, + "symfony:tdd-with-phpunit": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/tdd-with-phpunit/SKILL.md", + "computedHash": "484f05f7a16bf1e161eb4d2770b693526eb156f2a7502ea5833f64f5ef83e233" + }, + "symfony:test-doubles-mocking": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/test-doubles-mocking/SKILL.md", + "computedHash": "943d6a81a333d1a3a454510cf972c38181428a6d6186d1a19cfbe99ea7ffe3e1" + }, + "symfony:twig-components": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/twig-components/SKILL.md", + "computedHash": "ee7c1f99558ff8d28bbbb92fe47c41abc772ac76ef512ce645dbb88956cc20e5" + }, + "symfony:using-symfony-superpowers": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/using-symfony-superpowers/SKILL.md", + "computedHash": "8666a5b730f5cd8d1b66d07bfdf2afee3bdf0b41acc2a3d699a2bcff55c4151b" + }, + "symfony:value-objects-and-dtos": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/value-objects-and-dtos/SKILL.md", + "computedHash": "6db6bab1d41959b7e31ca3f5793548e057765b0bd1768b3f584357f49b7a92bb" + }, + "symfony:writing-plans": { + "source": "dev-toolings/superpowers-symfony", + "sourceType": "github", + "skillPath": "skills/writing-plans/SKILL.md", + "computedHash": "13387e37e27958478548530a78d130b8cc31fddc9f2903525e07ae1d3c7e80c0" + } + } +} diff --git a/src/AeonDumpManager.php b/src/AeonDumpManager.php new file mode 100644 index 0000000..ca537e3 --- /dev/null +++ b/src/AeonDumpManager.php @@ -0,0 +1,54 @@ +keepUserData()) { + return; + } + + // Remove or deactivate the data created by the plugin + } + + public function activate(ActivateContext $activateContext): void + { + // Activate entities, such as a new payment method + // Or create new entities here, because now your plugin is installed and active for sure + } + + public function deactivate(DeactivateContext $deactivateContext): void + { + // Deactivate entities, such as a new payment method + // Or remove previously created entities + } + + public function update(UpdateContext $updateContext): void + { + // Update necessary stuff, mostly non-database related + } + + public function postInstall(InstallContext $installContext): void + { + } + + public function postUpdate(UpdateContext $updateContext): void + { + } +} diff --git a/src/Command/ExampleCommand.php b/src/Command/ExampleCommand.php new file mode 100644 index 0000000..bc997c1 --- /dev/null +++ b/src/Command/ExampleCommand.php @@ -0,0 +1,30 @@ +setDescription('Does something very special.'); + } + + // Actual code executed in the command + protected function execute(InputInterface $input, OutputInterface $output): int + { + $output->writeln('It works!'); + + // Exit code 0 for success + return 0; + } +} diff --git a/src/Resources/app/administration/src/main.js b/src/Resources/app/administration/src/main.js new file mode 100644 index 0000000..14673d3 --- /dev/null +++ b/src/Resources/app/administration/src/main.js @@ -0,0 +1,2 @@ +// Import admin module +import './module/swag-example'; diff --git a/src/Resources/app/administration/src/module/swag-example/index.js b/src/Resources/app/administration/src/module/swag-example/index.js new file mode 100644 index 0000000..8d4b795 --- /dev/null +++ b/src/Resources/app/administration/src/module/swag-example/index.js @@ -0,0 +1,49 @@ +// /src/Resources/app/administration/src/module/swag-example/index.js +import './page/swag-example-list'; +import './page/swag-example-detail'; +import './page/swag-example-create'; +import deDE from './snippet/de-DE'; +import enGB from './snippet/en-GB'; + +Shopware.Module.register('swag-example', { + type: 'plugin', + name: 'Example', + title: 'swag-example.general.mainMenuItemGeneral', + description: 'sw-property.general.descriptionTextModule', + color: '#ff3d58', + icon: 'default-shopping-paper-bag-product', + + snippets: { + 'de-DE': deDE, + 'en-GB': enGB + }, + + routes: { + list: { + component: 'swag-example-list', + path: 'list' + }, + detail: { + component: 'swag-example-detail', + path: 'detail/:id', + meta: { + parentPath: 'swag.example.list' + } + }, + create: { + component: 'swag-example-create', + path: 'create', + meta: { + parentPath: 'swag.example.list' + } + } + }, + + navigation: [{ + label: 'swag-example.general.mainMenuItemGeneral', + color: '#ff3d58', + path: 'swag.example.list', + icon: 'default-shopping-paper-bag-product', + position: 100 + }] +}); diff --git a/src/Resources/app/administration/src/snippet/de-DE.json b/src/Resources/app/administration/src/snippet/de-DE.json new file mode 100644 index 0000000..7e9772a --- /dev/null +++ b/src/Resources/app/administration/src/snippet/de-DE.json @@ -0,0 +1,8 @@ +{ + "swag-example": { + "general": { + "mainMenuItemGeneral": "My custom module", + "descriptionTextModule": "Manage this custom module here" + } + } +} diff --git a/src/Resources/app/administration/src/snippet/en-GB.json b/src/Resources/app/administration/src/snippet/en-GB.json new file mode 100644 index 0000000..7e9772a --- /dev/null +++ b/src/Resources/app/administration/src/snippet/en-GB.json @@ -0,0 +1,8 @@ +{ + "swag-example": { + "general": { + "mainMenuItemGeneral": "My custom module", + "descriptionTextModule": "Manage this custom module here" + } + } +} diff --git a/src/Resources/config/config.xml b/src/Resources/config/config.xml new file mode 100644 index 0000000..46a0c16 --- /dev/null +++ b/src/Resources/config/config.xml @@ -0,0 +1,21 @@ + + + + + + Minimal configuration + + + maxDumps + + 6 + + + retantionDays + + 0 + + + + diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml new file mode 100644 index 0000000..f1d5e08 --- /dev/null +++ b/src/Resources/config/services.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ScheduledTask/ExampleTask.php b/src/ScheduledTask/ExampleTask.php new file mode 100644 index 0000000..d0fd069 --- /dev/null +++ b/src/ScheduledTask/ExampleTask.php @@ -0,0 +1,18 @@ +addCallingPlugin() + ->addActivePlugins('AeonDumpManager') + ->setForceInstallPlugins(true) + ->bootstrap() + ->getClassLoader(); + +$loader->addPsr4('AeonDumpManager\\Tests\\', __DIR__);