This commit is contained in:
2026-09-14 19:17:26 +02:00
commit f5ff279b7b
14 changed files with 610 additions and 0 deletions
+33
View File
@@ -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
+65
View File
@@ -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"
}
+23
View File
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
bootstrap="tests/TestBootstrap.php"
executionOrder="random">
<coverage>
<include>
<directory>./src/</directory>
</include>
</coverage>
<php>
<ini name="error_reporting" value="-1"/>
<server name="KERNEL_CLASS" value="Shopware\Core\Kernel"/>
<env name="APP_ENV" value="test"/>
<env name="APP_DEBUG" value="1"/>
<env name="SYMFONY_DEPRECATIONS_HELPER" value="weak"/>
</php>
<testsuites>
<testsuite name="AeonDumpManager Testsuite">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
+269
View File
@@ -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"
}
}
}
+54
View File
@@ -0,0 +1,54 @@
<?php declare(strict_types=1);
namespace AeonDumpManager;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\ActivateContext;
use Shopware\Core\Framework\Plugin\Context\DeactivateContext;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin\Context\UpdateContext;
class AeonDumpManager extends Plugin
{
public function install(InstallContext $installContext): void
{
// Do stuff such as creating a new payment method
}
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if ($uninstallContext->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
{
}
}
+30
View File
@@ -0,0 +1,30 @@
<?php declare(strict_types=1);
namespace AeonDumpManager\Command;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(
name: 'aeon:example',
description: 'Add a short description for your command',
)]
class ExampleCommand extends Command
{
// Provides a description, printed out in bin/console
protected function configure(): void
{
$this->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;
}
}
@@ -0,0 +1,2 @@
// Import admin module
import './module/swag-example';
@@ -0,0 +1,49 @@
// <plugin root>/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
}]
});
@@ -0,0 +1,8 @@
{
"swag-example": {
"general": {
"mainMenuItemGeneral": "My custom module",
"descriptionTextModule": "Manage this custom module here"
}
}
}
@@ -0,0 +1,8 @@
{
"swag-example": {
"general": {
"mainMenuItemGeneral": "My custom module",
"descriptionTextModule": "Manage this custom module here"
}
}
}
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/shopware/shopware/trunk/src/Core/System/SystemConfig/Schema/config.xsd">
<card>
<title>Minimal configuration</title>
<input-field type="number">
<name>maxDumps</name>
<label>Maximum allowed dumps to exist</label>
<defaultValue>6</defaultValue>
</input-field>
<input-field type="number">
<name>retantionDays</name>
<label>How many Days the dumps kept in the Storage. 0 Means unlimited</label>
<defaultValue>0</defaultValue>
</input-field>
</card>
</config>
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="AeonDumpManager\Command\ExampleCommand">
<tag name="console.command"/>
</service>
<service id="AeonDumpManager\ScheduledTask\ExampleTask">
<tag name="shopware.scheduled.task"/>
</service>
</services>
</container>
+18
View File
@@ -0,0 +1,18 @@
<?php declare(strict_types=1);
namespace AeonDumpManager\ScheduledTask;
use Shopware\Core\Framework\MessageQueue\ScheduledTask\ScheduledTask;
class ExampleTask extends ScheduledTask
{
public static function getTaskName(): string
{
return 'swag.example_task';
}
public static function getDefaultInterval(): int
{
return 300; // 5 minutes
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php declare(strict_types=1);
use Shopware\Core\TestBootstrapper;
$loader = (new TestBootstrapper())
->addCallingPlugin()
->addActivePlugins('AeonDumpManager')
->setForceInstallPlugins(true)
->bootstrap()
->getClassLoader();
$loader->addPsr4('AeonDumpManager\\Tests\\', __DIR__);