diff --git a/.env.dist b/.env.dist index 1f4ddbb..256b9ba 100644 --- a/.env.dist +++ b/.env.dist @@ -39,7 +39,7 @@ DATABASE_URL="mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@database:3306/${MYSQL_DATA # The URL of the Mercure hub, used by the app to publish updates (can be a local URL) MERCURE_URL=https://newsroom-php/.well-known/mercure # The public URL of the Mercure hub, used by the browser to connect -MERCURE_PUBLIC_URL=https://${SERVER_NAME}/.well-known/mercure +MERCURE_PUBLIC_URL="https://${SERVER_NAME}/.well-known/mercure" # The secret used to sign the JWTs MERCURE_JWT_SECRET="!NotSoSecretMercureHubJWTSecretKey!" ###< symfony/mercure-bundle ### diff --git a/composer.lock b/composer.lock index 27e891f..3beacfe 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9363e776834fe38b6d383eabb8461adb", + "content-hash": "0cd33192da4ef60028e3b2dab8d92170", "packages": [ { "name": "bacon/bacon-qr-code", @@ -476,21 +476,21 @@ }, { "name": "doctrine/dbal", - "version": "4.2.4", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec" + "reference": "ac336c95ea9e13433d56ca81c308b39db0e1a2a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/b37d160498ea91a2382a2ebe825c4ea6254fc0ec", - "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/ac336c95ea9e13433d56ca81c308b39db0e1a2a7", + "reference": "ac336c95ea9e13433d56ca81c308b39db0e1a2a7", "shasum": "" }, "require": { - "doctrine/deprecations": "^0.5.3|^1", - "php": "^8.1", + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, @@ -501,7 +501,7 @@ "phpstan/phpstan": "2.1.17", "phpstan/phpstan-phpunit": "2.0.6", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.46", + "phpunit/phpunit": "11.5.23", "slevomat/coding-standard": "8.16.2", "squizlabs/php_codesniffer": "3.13.1", "symfony/cache": "^6.3.8|^7.0", @@ -562,7 +562,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.4" + "source": "https://github.com/doctrine/dbal/tree/4.3.1" }, "funding": [ { @@ -578,7 +578,7 @@ "type": "tidelift" } ], - "time": "2025-06-15T23:15:01+00:00" + "time": "2025-07-22T10:09:51+00:00" }, { "name": "doctrine/deprecations", @@ -1166,16 +1166,16 @@ }, { "name": "doctrine/migrations", - "version": "3.9.0", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab" + "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/325b61e41d032f5f7d7e2d11cbefff656eadc9ab", - "reference": "325b61e41d032f5f7d7e2d11cbefff656eadc9ab", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/0f1e0c960ac29866d648a4f50142a74fe1cb6999", + "reference": "0f1e0c960ac29866d648a4f50142a74fe1cb6999", "shasum": "" }, "require": { @@ -1249,7 +1249,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.9.0" + "source": "https://github.com/doctrine/migrations/tree/3.9.1" }, "funding": [ { @@ -1265,20 +1265,20 @@ "type": "tidelift" } ], - "time": "2025-03-26T06:48:45+00:00" + "time": "2025-06-27T07:19:23+00:00" }, { "name": "doctrine/orm", - "version": "3.4.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "4664373bd0668d71b40cc368b950de95e1dba2f8" + "reference": "6deec3655ba3e8f15280aac11e264225854d2369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/4664373bd0668d71b40cc368b950de95e1dba2f8", - "reference": "4664373bd0668d71b40cc368b950de95e1dba2f8", + "url": "https://api.github.com/repos/doctrine/orm/zipball/6deec3655ba3e8f15280aac11e264225854d2369", + "reference": "6deec3655ba3e8f15280aac11e264225854d2369", "shasum": "" }, "require": { @@ -1353,9 +1353,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.4.0" + "source": "https://github.com/doctrine/orm/tree/3.5.0" }, - "time": "2025-06-14T11:47:14+00:00" + "time": "2025-07-01T17:40:53+00:00" }, { "name": "doctrine/persistence", @@ -1658,16 +1658,16 @@ }, { "name": "endroid/qr-code", - "version": "6.0.8", + "version": "6.0.9", "source": { "type": "git", "url": "https://github.com/endroid/qr-code.git", - "reference": "8102273afbcd5e3d95f1faaab2c5aa31e3637f61" + "reference": "21e888e8597440b2205e2e5c484b6c8e556bcd1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/endroid/qr-code/zipball/8102273afbcd5e3d95f1faaab2c5aa31e3637f61", - "reference": "8102273afbcd5e3d95f1faaab2c5aa31e3637f61", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/21e888e8597440b2205e2e5c484b6c8e556bcd1a", + "reference": "21e888e8597440b2205e2e5c484b6c8e556bcd1a", "shasum": "" }, "require": { @@ -1718,7 +1718,7 @@ ], "support": { "issues": "https://github.com/endroid/qr-code/issues", - "source": "https://github.com/endroid/qr-code/tree/6.0.8" + "source": "https://github.com/endroid/qr-code/tree/6.0.9" }, "funding": [ { @@ -1726,7 +1726,7 @@ "type": "github" } ], - "time": "2025-05-10T14:28:45+00:00" + "time": "2025-07-13T19:59:45+00:00" }, { "name": "endroid/qr-code-bundle", @@ -2042,16 +2042,16 @@ }, { "name": "league/commonmark", - "version": "2.7.0", + "version": "2.7.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405" + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", - "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", "shasum": "" }, "require": { @@ -2080,7 +2080,7 @@ "symfony/process": "^5.4 | ^6.0 | ^7.0", "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0 || ^5.0.0" + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" @@ -2145,7 +2145,7 @@ "type": "tidelift" } ], - "time": "2025-05-05T12:20:28+00:00" + "time": "2025-07-20T12:47:49+00:00" }, { "name": "league/config", @@ -2547,16 +2547,16 @@ }, { "name": "masterminds/html5", - "version": "2.9.0", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + "reference": "fcf91eb64359852f00d921887b219479b4f21251" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", - "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", "shasum": "" }, "require": { @@ -2608,9 +2608,9 @@ ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" }, - "time": "2024-03-31T07:05:07+00:00" + "time": "2025-07-25T09:04:22+00:00" }, { "name": "ml/iri", @@ -2963,16 +2963,16 @@ }, { "name": "paragonie/ecc", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/paragonie/phpecc.git", - "reference": "fdba22a506492eb6e5fe38c501c0df61eaf0b54c" + "reference": "d25bd2aab9b1205db1cf3aa3e83531d4549377bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/phpecc/zipball/fdba22a506492eb6e5fe38c501c0df61eaf0b54c", - "reference": "fdba22a506492eb6e5fe38c501c0df61eaf0b54c", + "url": "https://api.github.com/repos/paragonie/phpecc/zipball/d25bd2aab9b1205db1cf3aa3e83531d4549377bf", + "reference": "d25bd2aab9b1205db1cf3aa3e83531d4549377bf", "shasum": "" }, "require": { @@ -2982,11 +2982,13 @@ "php": "^7.1||^8.0" }, "require-dev": { + "bitcoin/bips": "dev-master", + "c2sp/wycheproof": "dev-master", "ext-json": "*", "phpunit/phpunit": "^6|^7|^8|^9", "squizlabs/php_codesniffer": "^2|^3", - "symfony/yaml": "^2.6|^3.0|^4", - "vimeo/psalm": "^2|^3|^4|^5" + "symfony/yaml": "^2.6|^3.0|^4|^5|^6|^7", + "vimeo/psalm": "^2|^3|^4|^5|^6" }, "suggest": { "ext-openssl": "(PHP 8.1, OpenSSL 3+) Improved performance, less worries about side-channels" @@ -3045,9 +3047,9 @@ ], "support": { "issues": "https://github.com/paragonie/phpecc/issues", - "source": "https://github.com/paragonie/phpecc/tree/v2.4.0" + "source": "https://github.com/paragonie/phpecc/tree/v2.5.0" }, - "time": "2025-01-21T17:53:03+00:00" + "time": "2025-07-19T01:25:49+00:00" }, { "name": "paragonie/sodium_compat", @@ -3317,16 +3319,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8", + "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8", "shasum": "" }, "require": { @@ -3358,9 +3360,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0" }, - "time": "2025-02-19T13:28:12+00:00" + "time": "2025-07-13T07:04:09+00:00" }, { "name": "phrity/comparison", @@ -5640,16 +5642,16 @@ }, { "name": "symfony/flex", - "version": "v2.7.1", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "4ae50d368415a06820739e54d38a4a29d6df9155" + "reference": "423c36e369361003dc31ef11c5f15fb589e52c01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/4ae50d368415a06820739e54d38a4a29d6df9155", - "reference": "4ae50d368415a06820739e54d38a4a29d6df9155", + "url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01", + "reference": "423c36e369361003dc31ef11c5f15fb589e52c01", "shasum": "" }, "require": { @@ -5688,7 +5690,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.7.1" + "source": "https://github.com/symfony/flex/tree/v2.8.1" }, "funding": [ { @@ -5704,7 +5706,7 @@ "type": "tidelift" } ], - "time": "2025-05-28T14:22:54+00:00" + "time": "2025-07-05T07:45:19+00:00" }, { "name": "symfony/form", @@ -8104,16 +8106,16 @@ }, { "name": "symfony/stimulus-bundle", - "version": "v2.26.1", + "version": "v2.28.1", "source": { "type": "git", "url": "https://github.com/symfony/stimulus-bundle.git", - "reference": "82c174ebe564e6ecc1412974b6380b86d450675f" + "reference": "960868a682271e133a631ffb70c7e2ceb5031be6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/82c174ebe564e6ecc1412974b6380b86d450675f", - "reference": "82c174ebe564e6ecc1412974b6380b86d450675f", + "url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/960868a682271e133a631ffb70c7e2ceb5031be6", + "reference": "960868a682271e133a631ffb70c7e2ceb5031be6", "shasum": "" }, "require": { @@ -8153,7 +8155,7 @@ "symfony-ux" ], "support": { - "source": "https://github.com/symfony/stimulus-bundle/tree/v2.26.1" + "source": "https://github.com/symfony/stimulus-bundle/tree/v2.28.1" }, "funding": [ { @@ -8169,7 +8171,7 @@ "type": "tidelift" } ], - "time": "2025-06-05T17:25:17+00:00" + "time": "2025-07-28T19:36:26+00:00" }, { "name": "symfony/stopwatch", @@ -8769,16 +8771,16 @@ }, { "name": "symfony/ux-icons", - "version": "v2.26.0", + "version": "v2.28.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-icons.git", - "reference": "e5c1e5b5093ae26dba45d0f3390a1e21f305c47a" + "reference": "1b48034b46a38595d576a425976dac7b33d428b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-icons/zipball/e5c1e5b5093ae26dba45d0f3390a1e21f305c47a", - "reference": "e5c1e5b5093ae26dba45d0f3390a1e21f305c47a", + "url": "https://api.github.com/repos/symfony/ux-icons/zipball/1b48034b46a38595d576a425976dac7b33d428b3", + "reference": "1b48034b46a38595d576a425976dac7b33d428b3", "shasum": "" }, "require": { @@ -8838,7 +8840,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-icons/tree/v2.26.0" + "source": "https://github.com/symfony/ux-icons/tree/v2.28.0" }, "funding": [ { @@ -8854,7 +8856,7 @@ "type": "tidelift" } ], - "time": "2025-05-30T02:07:34+00:00" + "time": "2025-07-25T06:20:58+00:00" }, { "name": "symfony/ux-live-component", @@ -8955,16 +8957,16 @@ }, { "name": "symfony/ux-twig-component", - "version": "v2.26.0", + "version": "v2.28.0", "source": { "type": "git", "url": "https://github.com/symfony/ux-twig-component.git", - "reference": "825e653b34fb48ed2198913c603d80f7632fe9c1" + "reference": "8b10610f7976aee34c40b51fed2244555ce9ead0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/825e653b34fb48ed2198913c603d80f7632fe9c1", - "reference": "825e653b34fb48ed2198913c603d80f7632fe9c1", + "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/8b10610f7976aee34c40b51fed2244555ce9ead0", + "reference": "8b10610f7976aee34c40b51fed2244555ce9ead0", "shasum": "" }, "require": { @@ -9018,7 +9020,7 @@ "twig" ], "support": { - "source": "https://github.com/symfony/ux-twig-component/tree/v2.26.0" + "source": "https://github.com/symfony/ux-twig-component/tree/v2.28.0" }, "funding": [ { @@ -9034,7 +9036,7 @@ "type": "tidelift" } ], - "time": "2025-05-26T06:21:54+00:00" + "time": "2025-06-27T09:05:08+00:00" }, { "name": "symfony/var-dumper", @@ -9838,16 +9840,16 @@ "packages-dev": [ { "name": "myclabs/deep-copy", - "version": "1.13.1", + "version": "1.13.3", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" + "reference": "faed855a7b5f4d4637717c2b3863e277116beb36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36", + "reference": "faed855a7b5f4d4637717c2b3863e277116beb36", "shasum": "" }, "require": { @@ -9886,7 +9888,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3" }, "funding": [ { @@ -9894,20 +9896,20 @@ "type": "tidelift" } ], - "time": "2025-04-29T12:36:36+00:00" + "time": "2025-07-05T12:25:42+00:00" }, { "name": "nikic/php-parser", - "version": "v5.5.0", + "version": "v5.6.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" + "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56", + "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56", "shasum": "" }, "require": { @@ -9950,9 +9952,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0" }, - "time": "2025-05-31T08:24:38+00:00" + "time": "2025-07-27T20:03:57+00:00" }, { "name": "phar-io/manifest", @@ -11667,16 +11669,16 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.63.0", + "version": "v1.64.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "69478ab39bc303abfbe3293006a78b09a8512425" + "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/69478ab39bc303abfbe3293006a78b09a8512425", - "reference": "69478ab39bc303abfbe3293006a78b09a8512425", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a", + "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a", "shasum": "" }, "require": { @@ -11704,6 +11706,7 @@ "symfony/http-client": "^6.4|^7.0", "symfony/phpunit-bridge": "^6.4.1|^7.0", "symfony/security-core": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.0|^4.x-dev" }, @@ -11739,7 +11742,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.63.0" + "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0" }, "funding": [ { @@ -11755,20 +11758,20 @@ "type": "tidelift" } ], - "time": "2025-04-26T01:41:37+00:00" + "time": "2025-06-23T16:12:08+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v7.3.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "2eabda563921f21cbce1d1e3247b3c36568905e6" + "reference": "71624984d8bcad6acf7a790d4e3ceafe04bc2485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2eabda563921f21cbce1d1e3247b3c36568905e6", - "reference": "2eabda563921f21cbce1d1e3247b3c36568905e6", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/71624984d8bcad6acf7a790d4e3ceafe04bc2485", + "reference": "71624984d8bcad6acf7a790d4e3ceafe04bc2485", "shasum": "" }, "require": { @@ -11820,8 +11823,11 @@ ], "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", + "keywords": [ + "testing" + ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.1" }, "funding": [ { @@ -11837,7 +11843,7 @@ "type": "tidelift" } ], - "time": "2025-05-23T07:26:30+00:00" + "time": "2025-06-04T10:09:06+00:00" }, { "name": "symfony/process", @@ -12041,8 +12047,7 @@ "php": ">=8.3.13", "ext-ctype": "*", "ext-iconv": "*", - "ext-openssl": "*", - "ext-redis": "*" + "ext-openssl": "*" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/migrations/Version20250729102713.php b/migrations/Version20250729102713.php new file mode 100644 index 0000000..398c1a3 --- /dev/null +++ b/migrations/Version20250729102713.php @@ -0,0 +1,71 @@ +addSql(<<<'SQL' + CREATE TABLE app_user (id INT AUTO_INCREMENT NOT NULL, npub VARCHAR(255) NOT NULL, roles JSON DEFAULT NULL, UNIQUE INDEX UNIQ_88BDF3E95FB8BABB (npub), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE article (id INT AUTO_INCREMENT NOT NULL, raw JSON DEFAULT NULL, event_id VARCHAR(225) DEFAULT NULL, slug LONGTEXT DEFAULT NULL, content LONGTEXT DEFAULT NULL, kind INT DEFAULT NULL, title LONGTEXT DEFAULT NULL, summary LONGTEXT DEFAULT NULL, pubkey VARCHAR(255) NOT NULL, created_at DATETIME DEFAULT NULL, sig VARCHAR(255) NOT NULL, image LONGTEXT DEFAULT NULL, published_at DATETIME DEFAULT NULL, topics JSON DEFAULT NULL, event_status INT DEFAULT NULL, current_places JSON DEFAULT NULL, rating_negative INT DEFAULT NULL, rating_positive INT DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE event (id VARCHAR(225) NOT NULL, event_id VARCHAR(225) DEFAULT NULL, kind INT NOT NULL, pubkey VARCHAR(255) NOT NULL, content LONGTEXT NOT NULL, created_at BIGINT NOT NULL, tags JSON NOT NULL, sig VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE nzine (id INT AUTO_INCREMENT NOT NULL, npub VARCHAR(255) NOT NULL, main_categories JSON NOT NULL, lists JSON DEFAULT NULL, editor VARCHAR(255) DEFAULT NULL, slug LONGTEXT DEFAULT NULL, state VARCHAR(255) NOT NULL, nzine_bot_id INT DEFAULT NULL, UNIQUE INDEX UNIQ_65025D9871FD5427 (nzine_bot_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE nzine_bot (id INT AUTO_INCREMENT NOT NULL, encrypted_nsec VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 + SQL); + $this->addSql(<<<'SQL' + CREATE TABLE sessions (sess_id VARBINARY(128) NOT NULL, sess_data LONGBLOB NOT NULL, sess_lifetime INT UNSIGNED NOT NULL, sess_time INT UNSIGNED NOT NULL, INDEX sess_lifetime_idx (sess_lifetime), PRIMARY KEY(sess_id)) DEFAULT CHARACTER SET utf8mb4 ENGINE = InnoDB + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE nzine ADD CONSTRAINT FK_65025D9871FD5427 FOREIGN KEY (nzine_bot_id) REFERENCES nzine_bot (id) + SQL); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql(<<<'SQL' + ALTER TABLE nzine DROP FOREIGN KEY FK_65025D9871FD5427 + SQL); + $this->addSql(<<<'SQL' + DROP TABLE app_user + SQL); + $this->addSql(<<<'SQL' + DROP TABLE article + SQL); + $this->addSql(<<<'SQL' + DROP TABLE event + SQL); + $this->addSql(<<<'SQL' + DROP TABLE nzine + SQL); + $this->addSql(<<<'SQL' + DROP TABLE nzine_bot + SQL); + $this->addSql(<<<'SQL' + DROP TABLE sessions + SQL); + } +} diff --git a/src/Command/DatabaseCleanupCommand.php b/src/Command/DatabaseCleanupCommand.php deleted file mode 100644 index 89c08cb..0000000 --- a/src/Command/DatabaseCleanupCommand.php +++ /dev/null @@ -1,48 +0,0 @@ -entityManager->getRepository(Article::class); - $items = $repository->findBy(['indexStatus' => IndexStatusEnum::DO_NOT_INDEX]); - - if (empty($items)) { - $output->writeln('No items found.'); - return Command::SUCCESS; - } - - foreach ($items as $item) { - $this->entityManager->remove($item); - } - - $this->entityManager->flush(); - - $output->writeln('Deleted ' . count($items) . ' items.'); - - - return Command::SUCCESS; - } -} diff --git a/src/Command/DeduplicateArticlesCommand.php b/src/Command/DeduplicateArticlesCommand.php deleted file mode 100644 index 4f633cc..0000000 --- a/src/Command/DeduplicateArticlesCommand.php +++ /dev/null @@ -1,67 +0,0 @@ -em->getRepository(Article::class); - $slugIndex = []; - $page = 0; - - // Process articles in batches - while (true) { - // Fetch a batch of articles - $articles = $repo->findBy([], ['createdAt' => 'DESC'], self::BATCH_SIZE, $page * self::BATCH_SIZE); - - if (empty($articles)) { - break; - } - - foreach ($articles as $article) { - $slug = $article->getSlug(); - - // If this slug hasn't been seen, store the slug - if (!in_array($slug, $slugIndex)) { - $slugIndex[] = $slug; - continue; - } - // The articles are sorted, so the first one should be kept - // Mark current article as DO_NOT_INDEX - $article->setIndexStatus(IndexStatusEnum::DO_NOT_INDEX); - } - - // Flush the batch and clear memory to avoid overload - $this->em->flush(); - $this->em->clear(); // Clear the entity manager to free up memory - - $output->writeln("Processed batch " . ($page + 1)); - $page++; - } - - $output->writeln('Article deduplication complete.'); - return Command::SUCCESS; - - } - -} diff --git a/src/Command/MarkAsIndexedCommand.php b/src/Command/MarkAsIndexedCommand.php deleted file mode 100644 index 0bf3b43..0000000 --- a/src/Command/MarkAsIndexedCommand.php +++ /dev/null @@ -1,41 +0,0 @@ -entityManager->getRepository(Article::class)->findBy(['indexStatus' => IndexStatusEnum::TO_BE_INDEXED]); - $count = 0; - foreach ($articles as $article) { - if ($article instanceof Article) { - $count += 1; - $article->setIndexStatus(IndexStatusEnum::INDEXED); - $this->entityManager->persist($article); - } - } - - $this->entityManager->flush(); - - $output->writeln($count . ' articles marked as indexed successfully.'); - - return Command::SUCCESS; - } -} diff --git a/src/Service/CacheService.php b/src/Service/CacheService.php new file mode 100644 index 0000000..b0aba8b --- /dev/null +++ b/src/Service/CacheService.php @@ -0,0 +1,69 @@ +cache->get($cacheKey, function (ItemInterface $item) use ($npub) { + $item->expiresAfter(3600); // 1 hour, adjust as needed + try { + $meta = $this->nostrClient->getNpubMetadata($npub); + } catch (\Exception $e) { + $this->logger->error('Error getting user data.', ['exception' => $e]); + $meta = new \stdClass(); + $content = new \stdClass(); + $meta->name = substr($npub, 0, 8) . '…' . substr($npub, -4); + $meta->content = json_encode($content); + } + $this->logger->info('Metadata:', ['meta' => json_encode($meta)]); + return json_decode($meta->content); + }); + } catch (InvalidArgumentException $e) { + $this->logger->error('Error getting user data.', ['exception' => $e]); + $content = new \stdClass(); + $content->name = substr($npub, 0, 8) . '…' . substr($npub, -4); + return $content; + } + } + + public function getRelays($npub) + { + $cacheKey = '3_' . $npub; + try { + return $this->cache->get($cacheKey, function (ItemInterface $item) use ($npub) { + $item->expiresAfter(3600); // 1 hour + try { + return $this->nostrClient->getRelaysForNpub($npub); + } catch (\Exception $e) { + $this->logger->error('Error getting relays.', ['exception' => $e]); + return []; + } + }); + } catch (InvalidArgumentException $e) { + $this->logger->error('Error getting relay data.', ['exception' => $e]); + return []; + } + } +} diff --git a/src/Service/NostrClient.php b/src/Service/NostrClient.php index dfa825a..1b4d6b5 100644 --- a/src/Service/NostrClient.php +++ b/src/Service/NostrClient.php @@ -28,12 +28,6 @@ class NostrClient */ private const array REPUTABLE_RELAYS = [ 'wss://theforest.nostr1.com', - 'wss://relay.damus.io', - 'wss://relay.primal.net', - 'wss://nos.lol', - 'wss://relay.snort.social', - 'wss://nostr.land', - 'wss://purplepag.es', ]; public function __construct(private readonly EntityManagerInterface $entityManager, @@ -43,9 +37,7 @@ class NostrClient private readonly LoggerInterface $logger) { $this->defaultRelaySet = new RelaySet(); - $this->defaultRelaySet->addRelay(new Relay('wss://theforest.nostr1.com')); // public aggregator relay - $this->defaultRelaySet->addRelay(new Relay('wss://relay.damus.io')); // public aggregator relay - $this->defaultRelaySet->addRelay(new Relay('wss://relay.primal.net')); // public aggregator relay + $this->defaultRelaySet->addRelay(new Relay('wss://theforest.nostr1.com')); } /**