diff --git a/.env b/.env
index 0a412c9..fccfe41 100644
--- a/.env
+++ b/.env
@@ -20,4 +20,9 @@ JWT_COOKIE_TTL=86400
DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}?serverVersion=16&charset=utf8"
-ENCRYPTION_KEY=change_me_in_env_local
\ No newline at end of file
+ENCRYPTION_KEY=change_me_in_env_local
+###> symfony/lock ###
+# Choose one of the stores below
+# postgresql+advisory://db_user:db_password@localhost/db_name
+LOCK_DSN=flock
+###< symfony/lock ###
diff --git a/composer.json b/composer.json
index e57c860..6b15e9b 100644
--- a/composer.json
+++ b/composer.json
@@ -26,6 +26,7 @@
"symfony/flex": "^2",
"symfony/framework-bundle": "8.0.*",
"symfony/http-client": "8.0.*",
+ "symfony/lock": "8.0.*",
"symfony/mcp-bundle": "^0.6.0",
"symfony/mime": "8.0.*",
"symfony/monolog-bundle": "^4.0",
@@ -36,7 +37,8 @@
"symfony/security-bundle": "8.0.*",
"symfony/serializer": "8.0.*",
"symfony/validator": "8.0.*",
- "symfony/yaml": "8.0.*"
+ "symfony/yaml": "8.0.*",
+ "webklex/php-imap": "^6.2"
},
"config": {
"allow-plugins": {
diff --git a/composer.lock b/composer.lock
index 59647f2..b871c3d 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": "0bdbfd9abe99ffd23a53df611d8a879c",
+ "content-hash": "0a35f14eff2d93998449dc614f02d610",
"packages": [
{
"name": "api-platform/doctrine-common",
@@ -1156,6 +1156,75 @@
},
"time": "2026-01-26T15:45:40+00:00"
},
+ {
+ "name": "carbonphp/carbon-doctrine-types",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
+ "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+ "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "conflict": {
+ "doctrine/dbal": "<4.0.0 || >=5.0.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^4.0.0",
+ "nesbot/carbon": "^2.71.0 || ^3.0.0",
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KyleKatarn",
+ "email": "kylekatarnls@gmail.com"
+ }
+ ],
+ "description": "Types to use Carbon in Doctrine",
+ "keywords": [
+ "carbon",
+ "date",
+ "datetime",
+ "doctrine",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-09T16:56:22+00:00"
+ },
{
"name": "composer/pcre",
"version": "3.3.2",
@@ -2439,6 +2508,386 @@
},
"time": "2026-02-08T16:21:46+00:00"
},
+ {
+ "name": "illuminate/collections",
+ "version": "v13.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/collections.git",
+ "reference": "17b082d0c66fb030f22d5bdd62ba652c045ff522"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/17b082d0c66fb030f22d5bdd62ba652c045ff522",
+ "reference": "17b082d0c66fb030f22d5bdd62ba652c045ff522",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/conditionable": "^13.0",
+ "illuminate/contracts": "^13.0",
+ "illuminate/macroable": "^13.0",
+ "php": "^8.3",
+ "symfony/polyfill-php84": "^1.33",
+ "symfony/polyfill-php85": "^1.33",
+ "symfony/polyfill-php86": "^1.36"
+ },
+ "suggest": {
+ "illuminate/http": "Required to convert collections to API resources (^13.0).",
+ "symfony/var-dumper": "Required to use the dump method (^7.4 || ^8.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "functions.php",
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Collections package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-04-28T17:17:15+00:00"
+ },
+ {
+ "name": "illuminate/conditionable",
+ "version": "v13.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/conditionable.git",
+ "reference": "7f1ef52d9a346f829421b296adfb7644a951b216"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/conditionable/zipball/7f1ef52d9a346f829421b296adfb7644a951b216",
+ "reference": "7f1ef52d9a346f829421b296adfb7644a951b216",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Conditionable package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-02-25T16:07:55+00:00"
+ },
+ {
+ "name": "illuminate/contracts",
+ "version": "v13.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/contracts.git",
+ "reference": "b88c1134feb4253a71048e7e2b5c431e9b3ab95b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/b88c1134feb4253a71048e7e2b5c431e9b3ab95b",
+ "reference": "b88c1134feb4253a71048e7e2b5c431e9b3ab95b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.3",
+ "psr/container": "^1.1.1 || ^2.0.1",
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Contracts\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Contracts package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-05-13T13:44:10+00:00"
+ },
+ {
+ "name": "illuminate/macroable",
+ "version": "v13.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/macroable.git",
+ "reference": "59b5b5f3cf290a91db8cf6cd3d35ff56978bc057"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/macroable/zipball/59b5b5f3cf290a91db8cf6cd3d35ff56978bc057",
+ "reference": "59b5b5f3cf290a91db8cf6cd3d35ff56978bc057",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Macroable package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-04-29T09:35:06+00:00"
+ },
+ {
+ "name": "illuminate/pagination",
+ "version": "v13.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/pagination.git",
+ "reference": "0e788e59a857f4c6fd6f084fc4848714c8cd5bbb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/pagination/zipball/0e788e59a857f4c6fd6f084fc4848714c8cd5bbb",
+ "reference": "0e788e59a857f4c6fd6f084fc4848714c8cd5bbb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "illuminate/collections": "^13.0",
+ "illuminate/contracts": "^13.0",
+ "illuminate/support": "^13.0",
+ "php": "^8.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Pagination\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Pagination package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-05-13T14:00:22+00:00"
+ },
+ {
+ "name": "illuminate/reflection",
+ "version": "v13.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/reflection.git",
+ "reference": "4fe1659f068ab2b50131cf906c5d8bba4e34df0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/reflection/zipball/4fe1659f068ab2b50131cf906c5d8bba4e34df0c",
+ "reference": "4fe1659f068ab2b50131cf906c5d8bba4e34df0c",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/collections": "^13.0",
+ "illuminate/contracts": "^13.0",
+ "php": "^8.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Reflection package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-03-10T20:04:12+00:00"
+ },
+ {
+ "name": "illuminate/support",
+ "version": "v13.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/support.git",
+ "reference": "ff687db22aefef516efd3ea21d01664af332da38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/ff687db22aefef516efd3ea21d01664af332da38",
+ "reference": "ff687db22aefef516efd3ea21d01664af332da38",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "^2.0",
+ "ext-ctype": "*",
+ "ext-filter": "*",
+ "ext-mbstring": "*",
+ "illuminate/collections": "^13.0",
+ "illuminate/conditionable": "^13.0",
+ "illuminate/contracts": "^13.0",
+ "illuminate/macroable": "^13.0",
+ "illuminate/reflection": "^13.0",
+ "nesbot/carbon": "^3.8.4",
+ "php": "^8.3",
+ "symfony/polyfill-php85": "^1.33",
+ "voku/portable-ascii": "^2.0.2"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "replace": {
+ "spatie/once": "*"
+ },
+ "suggest": {
+ "illuminate/filesystem": "Required to use the Composer class (^13.0).",
+ "laravel/serializable-closure": "Required to use the once function (^2.0.10).",
+ "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).",
+ "league/uri": "Required to use the Uri class (^7.5.1).",
+ "ramsey/uuid": "Required to use Str::uuid() (^4.7).",
+ "symfony/process": "Required to use the Composer class (^7.4 || ^8.0).",
+ "symfony/uid": "Required to use Str::ulid() (^7.4 || ^8.0).",
+ "symfony/var-dumper": "Required to use the dd function (^7.4 || ^8.0).",
+ "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "13.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "functions.php",
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Support package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-05-04T12:34:54+00:00"
+ },
{
"name": "lcobucci/jwt",
"version": "5.6.0",
@@ -3057,6 +3506,111 @@
},
"time": "2026-01-12T15:59:08+00:00"
},
+ {
+ "name": "nesbot/carbon",
+ "version": "3.11.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon.git",
+ "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60",
+ "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60",
+ "shasum": ""
+ },
+ "require": {
+ "carbonphp/carbon-doctrine-types": "<100.0",
+ "ext-json": "*",
+ "php": "^8.1",
+ "psr/clock": "^1.0",
+ "symfony/clock": "^6.3.12 || ^7.0 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6.3 || ^4.0",
+ "doctrine/orm": "^2.15.2 || ^3.0",
+ "friendsofphp/php-cs-fixer": "^v3.87.1",
+ "kylekatarnls/multi-tester": "^2.5.3",
+ "phpmd/phpmd": "^2.15.0",
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^2.1.22",
+ "phpunit/phpunit": "^10.5.53",
+ "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "https://markido.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "https://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "https://carbonphp.github.io/carbon/",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html",
+ "issues": "https://github.com/CarbonPHP/carbon/issues",
+ "source": "https://github.com/CarbonPHP/carbon"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-07T09:57:54+00:00"
+ },
{
"name": "nyholm/psr7",
"version": "1.8.2",
@@ -6379,6 +6933,88 @@
],
"time": "2026-03-06T16:58:46+00:00"
},
+ {
+ "name": "symfony/lock",
+ "version": "v8.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/lock.git",
+ "reference": "02e7142df3d647411fd88655d20d8ec79dafb78c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/lock/zipball/02e7142df3d647411fd88655d20d8ec79dafb78c",
+ "reference": "02e7142df3d647411fd88655d20d8ec79dafb78c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4",
+ "psr/log": "^1|^2|^3"
+ },
+ "conflict": {
+ "doctrine/dbal": "<4.3"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^4.3",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/serializer": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Lock\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jérémy Derussé",
+ "email": "jeremy@derusse.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cas",
+ "flock",
+ "locking",
+ "mutex",
+ "redlock",
+ "semaphore"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/lock/tree/v8.0.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-29T15:02:55+00:00"
+ },
{
"name": "symfony/mcp-bundle",
"version": "v0.6.0",
@@ -7268,6 +7904,86 @@
],
"time": "2025-06-23T16:12:55+00:00"
},
+ {
+ "name": "symfony/polyfill-php86",
+ "version": "v1.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php86.git",
+ "reference": "33d8fc5a705481e21fe3a81212b26f9b1f61749c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/33d8fc5a705481e21fe3a81212b26f9b1f61749c",
+ "reference": "33d8fc5a705481e21fe3a81212b26f9b1f61749c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php86\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.6+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php86/tree/v1.37.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-26T13:13:48+00:00"
+ },
{
"name": "symfony/polyfill-uuid",
"version": "v1.33.0",
@@ -8522,6 +9238,99 @@
],
"time": "2026-02-09T10:14:57+00:00"
},
+ {
+ "name": "symfony/translation",
+ "version": "v8.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "f63e9342e12646a57c91ef8a366a4f9d8e557b67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/f63e9342e12646a57c91ef8a366a4f9d8e557b67",
+ "reference": "f63e9342e12646a57c91ef8a366a4f9d8e557b67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation-contracts": "^3.6.1"
+ },
+ "conflict": {
+ "nikic/php-parser": "<5.0",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3|3.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^5.0",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^7.4|^8.0",
+ "symfony/console": "^7.4|^8.0",
+ "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/finder": "^7.4|^8.0",
+ "symfony/http-client-contracts": "^2.5|^3.0",
+ "symfony/http-kernel": "^7.4|^8.0",
+ "symfony/intl": "^7.4|^8.0",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^7.4|^8.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^7.4|^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v8.0.10"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-06T11:30:54+00:00"
+ },
{
"name": "symfony/translation-contracts",
"version": "v3.6.1",
@@ -9185,6 +9994,161 @@
],
"time": "2026-02-09T10:14:57+00:00"
},
+ {
+ "name": "voku/portable-ascii",
+ "version": "2.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "8e1051fe39379367aecf014f41744ce7539a856f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f",
+ "reference": "8e1051fe39379367aecf014f41744ce7539a856f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "https://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/2.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-26T05:33:54+00:00"
+ },
+ {
+ "name": "webklex/php-imap",
+ "version": "6.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Webklex/php-imap.git",
+ "reference": "6b8ef85d621bbbaf52741b00cca8e9237e2b2e05"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Webklex/php-imap/zipball/6b8ef85d621bbbaf52741b00cca8e9237e2b2e05",
+ "reference": "6b8ef85d621bbbaf52741b00cca8e9237e2b2e05",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "ext-iconv": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "ext-zip": "*",
+ "illuminate/pagination": ">=5.0.0",
+ "nesbot/carbon": "^2.62.1|^3.2.4",
+ "php": "^8.0.2",
+ "symfony/http-foundation": ">=2.8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5.10"
+ },
+ "suggest": {
+ "symfony/mime": "Recomended for better extension support",
+ "symfony/var-dumper": "Usefull tool for debugging"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webklex\\PHPIMAP\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Malte Goldenbaum",
+ "email": "github@webklex.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP IMAP client",
+ "homepage": "https://github.com/webklex/php-imap",
+ "keywords": [
+ "imap",
+ "mail",
+ "php-imap",
+ "pop3",
+ "webklex"
+ ],
+ "support": {
+ "issues": "https://github.com/Webklex/php-imap/issues",
+ "source": "https://github.com/Webklex/php-imap/tree/6.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.buymeacoffee.com/webklex",
+ "type": "custom"
+ },
+ {
+ "url": "https://ko-fi.com/webklex",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2025-04-25T06:02:37+00:00"
+ },
{
"name": "webmozart/assert",
"version": "2.1.6",
diff --git a/config/packages/lock.yaml b/config/packages/lock.yaml
new file mode 100644
index 0000000..574879f
--- /dev/null
+++ b/config/packages/lock.yaml
@@ -0,0 +1,2 @@
+framework:
+ lock: '%env(LOCK_DSN)%'
diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml
new file mode 100644
index 0000000..490bfc2
--- /dev/null
+++ b/config/packages/translation.yaml
@@ -0,0 +1,5 @@
+framework:
+ default_locale: en
+ translator:
+ default_path: '%kernel.project_dir%/translations'
+ providers:
diff --git a/phpunit.dist.xml b/phpunit.dist.xml
index eb794bd..bec7cd2 100644
--- a/phpunit.dist.xml
+++ b/phpunit.dist.xml
@@ -16,6 +16,12 @@
+
+
+
+
+
+
diff --git a/symfony.lock b/symfony.lock
index 3eee6c4..d748755 100644
--- a/symfony.lock
+++ b/symfony.lock
@@ -169,6 +169,18 @@
".editorconfig"
]
},
+ "symfony/lock": {
+ "version": "8.0",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.2",
+ "ref": "8e937ff2b4735d110af1770f242c1107fdab4c8e"
+ },
+ "files": [
+ "config/packages/lock.yaml"
+ ]
+ },
"symfony/mcp-bundle": {
"version": "v0.6.0"
},
@@ -222,6 +234,19 @@
"config/routes/security.yaml"
]
},
+ "symfony/translation": {
+ "version": "8.0",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "6.3",
+ "ref": "620a1b84865ceb2ba304c8f8bf2a185fbf32a843"
+ },
+ "files": [
+ "config/packages/translation.yaml",
+ "translations/.gitignore"
+ ]
+ },
"symfony/uid": {
"version": "8.0",
"recipe": {
diff --git a/translations/.gitignore b/translations/.gitignore
new file mode 100644
index 0000000..e69de29