Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
b5ec872
ECTO-2233 - added extenison-store-channel service to handle communica…
FloBWer Oct 22, 2025
785ec9a
ECTO-2203 - add changes for checkout out of the evaluation to the fea…
FloBWer Oct 29, 2025
85a84f1
ECTO-2282 - make iframe url configurable (#126)
FloBWer Dec 1, 2025
c2d26ea
ECTO-2328 - changed language handover (#128)
FloBWer Dec 4, 2025
bcb1e10
ECTO-2339 - added approach for deep lining into the iframe store (#129)
FloBWer Jan 5, 2026
9106fce
ECTO-2406 - added post message function for copy to clipboard (#130)
FloBWer Feb 13, 2026
bfceaf2
ECTO-2395 - implemented rough woring checkout with sample modal (#131)
FloBWer Feb 23, 2026
bd29979
ECTO-2396 - add checkout process implementation (#132)
kaigossel Mar 16, 2026
b00f844
ECTO-2581 - Add tracking for extension store checkout (#144)
qysp Apr 27, 2026
848c6bc
ODLY-5579 - Fix SW Admin modal footers not being visible (#146)
qysp Apr 29, 2026
1542eb3
ECTO-2474 - update query params regarding to search filter and pagina…
FloBWer Apr 30, 2026
cda3bac
ECTO-2521 - added error messages of api to the checkout (#152)
FloBWer May 7, 2026
c7146c6
ECTO-2573 - add licenseHost for SkyBridgeStore tracking (#153)
mappinnn May 8, 2026
6022171
ECTO-2638 - Provide the entire user info state to the app (#155)
qysp May 19, 2026
cf21a04
ECTO-2554 - Make extension installation after checkout optional (#156)
qysp May 20, 2026
6bdaceb
ECTO-2635 - always push router updates, publish popstate router state…
kaigossel May 26, 2026
d8a2fe9
ECTO-2659 - Refactor iframe rendering (#159)
qysp May 28, 2026
1474739
ECTO-2672 - Remove unused components, snippets, endpoints etc. (#161)
qysp Jun 16, 2026
5cc8fd6
ECTO-2666 - Fix various backporting related issues
qysp Jun 16, 2026
e045d11
ECTO-2679 - Support deep linking to PDP by internal ID or technical n…
qysp Jun 18, 2026
a002e46
ECTO-2666 - Change the default iframe URL to production (#174)
qysp Jun 22, 2026
4d340e1
ECTO-2679 - Regard the state on router updates (#175)
qysp Jun 22, 2026
304f750
ECTO-2686 - added licenseHost to the handshake object (#171)
FloBWer Jun 18, 2026
5a80947
ECTO-2666 - Fix PHPStan issues & store registration for 6.6.9.0
qysp Jun 23, 2026
5c1c778
ECTO-2704 - Prevent automatic installation of incompatible extensions…
qysp Jun 26, 2026
9d3bb4b
ECTO-2707 - Add installation in progress hint in checkout modal (#179)
qysp Jun 26, 2026
aff8ac8
ECTO-2706 - include installed extension versions in store context (#180)
mappinnn Jun 30, 2026
34f6b03
ECTO-2707 - Fix installation in progress hint in checkout modal (#182)
qysp Jun 30, 2026
26f8923
ECTO-2702 - only add licensed extensions as owned on handshake (#183)
kaigossel Jul 6, 2026
2264ea0
Epic/ecto 2267 66x cherry pick (#201)
kaigossel Aug 24, 2026
e4fe409
Fix Static Analyse failure by removing invalid coverage-ignore annota…
Copilot Jun 25, 2026
a8863c2
feat: Move analysis promotion to other position (#202)
quynhnguyen68 Aug 21, 2026
2d5c3f0
fix: Fix release store error (#204)
quynhnguyen68 Aug 28, 2026
b2073c0
fix: Fix svg file build (#206)
quynhnguyen68 Aug 28, 2026
65461f8
fix: unbreak PHPStan EntitySearchResult deprecations (#189)
roboshyim Jul 28, 2026
72ed6ad
chore: Prepare code for PHPStan update 2026-07 (#192)
mitelg Jul 30, 2026
54cd45c
fix: PHPStan issue with widened return type (#199)
mitelg Aug 10, 2026
9cc9ee6
Fix Static Analyse failure for InAppPurchaseStruct coverage rule (#209)
Copilot Sep 11, 2026
b30338f
ECTO-2918 - add missing snippets
kaigossel Sep 18, 2026
10b1eb6
ECTO-2918 - fix client exception body parsing
kaigossel Sep 18, 2026
70ce8f3
ECTO-2918 - bump release version
kaigossel Sep 18, 2026
abbf197
ECTO-2918 - fix backporting issues
kaigossel Sep 18, 2026
7947961
ECTO-2948 - fix checkout modal styling issues
kaigossel Sep 21, 2026
ae3272a
ECTO-2948 - fix installAfterPurchase checkbox state
kaigossel Sep 21, 2026
15947f7
ECTO-2918 - prevent Meteor SDK warnings for extension store channel
kaigossel Sep 21, 2026
02dbf7c
ECTO-2918 - fix unit test
kaigossel Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .php-cs-fixer.dist.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,15 @@
'php_unit_dedicate_assert' => ['target' => 'newest'],
'php_unit_dedicate_assert_internal_type' => true,
'php_unit_mock' => true,
'php_unit_test_case_static_method_calls' => ['call_type' => 'static'],
'php_unit_test_case_static_method_calls' => ['methods' => [
'any' => 'this',
'never' => 'this',
'atLeast' => 'this',
'atLeastOnce' => 'this',
'once' => 'this',
'exactly' => 'this',
'atMost' => 'this',
]],
'self_accessor' => false,
'single_line_throw' => false,
'single_quote' => ['strings_containing_single_quote_chars' => true],
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "swag/swag-extension-store",
"version": "3.4.2",
"version": "6.0.0",
"description": "SWAG Extension Store",
"type": "shopware-platform-plugin",
"license": "MIT",
Expand Down
4 changes: 0 additions & 4 deletions phpstan.neon.dist
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@ parameters:
message: '#Service ".*" is private#'
path: tests

- # Ignore namespace for test plugins
message: '#Class like namespace .* does not follow PSR-4 configuration in composer.json#'
path: tests/_fixtures

- # Ignore native type change
message: '#Call to deprecated method scope\(\) of class Shopware\\Core\\Framework\\Context.*#'
path: src/Controller/InAppPurchasesController.php
Expand Down
74 changes: 0 additions & 74 deletions src/Controller/DataController.php

This file was deleted.

2 changes: 1 addition & 1 deletion src/Controller/InAppPurchasesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public function orderCart(RequestDataBag $data, Context $context): Response
\assert($positions instanceof RequestDataBag);
$extensionName = $data->get('name');

$positionCollection = InAppPurchaseCartPositionCollection::fromArray($positions->all());
$positionCollection = InAppPurchaseCartPositionCollection::fromArray(array_values($positions->all()));

$app = $this->getAppByName($extensionName, $context);
if (!$app) {
Expand Down
6 changes: 3 additions & 3 deletions src/Controller/LicenseController.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ public function createCart(Request $request, Context $context): JsonResponse
$extensionId = $request->request->get('extensionId');
$variantId = $request->request->get('variantId');

if (!is_numeric($extensionId)) {
if (!\is_int($extensionId) && !\is_string($extensionId)) {
throw ExtensionStoreException::invalidExtensionId();
}

if (!is_numeric($variantId)) {
if (!\is_int($variantId) && !\is_string($variantId)) {
throw ExtensionStoreException::invalidVariantId();
}

$cart = $this->licenseService->createCart((int) $extensionId, (int) $variantId, $context);
$cart = $this->licenseService->createCart($extensionId, $variantId, $context);

return new JsonResponse($cart);
}
Expand Down
34 changes: 29 additions & 5 deletions src/Exception/ExtensionStoreApiException.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,48 @@ class ExtensionStoreApiException extends StoreApiException
{
protected string $apiCode;

protected string $description;

public function __construct(ClientException $exception)
{
$data = json_decode($exception->getResponse()->getBody()->getContents(), true);

parent::__construct($exception);

$data = $this->getData($exception);
$this->apiCode = $data['code'] ?? '';
$this->description = $data['description'] ?? '';
}

public function getErrors(bool $withTrace = false): \Generator
{
$errors = parent::getErrors($withTrace);

foreach ($errors as $error) {
foreach (parent::getErrors($withTrace) as $error) {
yield [
...$error,
'apiCode' => $this->apiCode,
'description' => $this->description,
];
}
}

/**
* @return array<array-key, mixed>
*/
private function getData(ClientException $exception): array
{
$body = $exception->getResponse()->getBody();

// The parent constructor already read the body to its end and left the stream at EOF,
// so reading it again without rewinding yields an empty string.
if ($body->isSeekable()) {
$body->rewind();
}

try {
$data = json_decode($body->getContents(), true, 512, \JSON_THROW_ON_ERROR);
} catch (\JsonException) {
return [];
}

// A body may be valid JSON without being an object, e.g. a bare string or number.
return \is_array($data) ? $data : [];
}
}
41 changes: 41 additions & 0 deletions src/Migration/Migration1779864357StoreIFrameUrlConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php declare(strict_types=1);

namespace SwagExtensionStore\Migration;

use Doctrine\DBAL\Connection;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\Log\Package;
use Shopware\Core\Framework\Migration\MigrationStep;
use Shopware\Core\Framework\Uuid\Uuid;

/**
* @internal
*/
#[Package('checkout')]
class Migration1779864357StoreIFrameUrlConfig extends MigrationStep
{
public function getCreationTimestamp(): int
{
return 1779864357;
}

public function update(Connection $connection): void
{
$configurationKey = 'SwagExtensionStore.config.iframeUrl';
$configurationExists = $connection->fetchOne(
'SELECT 1 FROM system_config WHERE configuration_key = :configurationKey',
['configurationKey' => $configurationKey],
);

if ($configurationExists !== false) {
return;
}

$connection->insert('system_config', [
'id' => Uuid::randomBytes(),
'configuration_key' => $configurationKey,
'configuration_value' => '{"_value": "https://sky-bridge-store.production.shopware.in"}',
'created_at' => (new \DateTimeImmutable())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
]);
}
}
11 changes: 10 additions & 1 deletion src/Resources/app/administration/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ module.exports = {
'@shopware-ag/eslint-config-base',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'plugin:@typescript-eslint/recommended-requiring-type-checking'
],
parser: '@typescript-eslint/parser',
parserOptions: {
Expand All @@ -81,6 +81,15 @@ module.exports = {
'no-void': 'off',
'no-unused-vars': 'off',
'no-shadow': 'off',
'no-useless-constructor': 'off',
'no-empty-function': 'off',
'default-case': 'off',
'consistent-return': 'off',
'max-len': 'off',
'no-return-await': 'off',
'no-restricted-syntax': 'off',

'import/prefer-default-export': 'off',

'@typescript-eslint/indent': ['error', 4, { SwitchCase: 1 }],
'@typescript-eslint/ban-ts-comment': 0,
Expand Down
5 changes: 3 additions & 2 deletions src/Resources/app/administration/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module.exports = {
preset: '@shopware-ag/jest-preset-sw6-admin',
globals: {
// required, e.g. /www/sw6/platform/src/Administration/Resources/app/administration
adminPath
adminPath,
},

setupFilesAfterEnv: [
Expand Down Expand Up @@ -39,7 +39,8 @@ module.exports = {
'^\@shopware-ag\/meteor-admin-sdk\/es\/(.*)':
`${process.env.ADMIN_PATH}/node_modules/@shopware-ag/meteor-admin-sdk/umd/$1`,
vue$: '<rootDir>/node_modules/@vue/compat/dist/vue.cjs.js',
'@vue/test-utils': '<rootDir>/node_modules/@vue/test-utils'
'@vue/test-utils': '<rootDir>/node_modules/@vue/test-utils',
'^lodash-es/(.*)$': 'lodash/$1'
},

transformIgnorePatterns: [
Expand Down
Loading
Loading