backend notifications implementation

This commit is contained in:
Čarodej
2022-03-10 11:49:02 +01:00
parent 70d7f2f5bd
commit 64e80d387b
20 changed files with 617 additions and 280 deletions

338
composer.lock generated
View File

@@ -280,16 +280,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.211.1", "version": "3.212.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "fa6b2cc2df7563b775b346d60da4d36c06062ce1" "reference": "ed69594b385233bb895342e18008cd811e8225e7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fa6b2cc2df7563b775b346d60da4d36c06062ce1", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/ed69594b385233bb895342e18008cd811e8225e7",
"reference": "fa6b2cc2df7563b775b346d60da4d36c06062ce1", "reference": "ed69594b385233bb895342e18008cd811e8225e7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -365,9 +365,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.211.1" "source": "https://github.com/aws/aws-sdk-php/tree/3.212.5"
}, },
"time": "2022-03-01T19:17:13+00:00" "time": "2022-03-09T19:19:58+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@@ -1413,16 +1413,16 @@
}, },
{ {
"name": "doctrine/dbal", "name": "doctrine/dbal",
"version": "2.13.7", "version": "2.13.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/dbal.git", "url": "https://github.com/doctrine/dbal.git",
"reference": "6e22f6012b42d7932674857989fcf184e9e9b1c3" "reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/6e22f6012b42d7932674857989fcf184e9e9b1c3", "url": "https://api.github.com/repos/doctrine/dbal/zipball/dc9b3c3c8592c935a6e590441f9abc0f9eba335b",
"reference": "6e22f6012b42d7932674857989fcf184e9e9b1c3", "reference": "dc9b3c3c8592c935a6e590441f9abc0f9eba335b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1435,13 +1435,13 @@
"require-dev": { "require-dev": {
"doctrine/coding-standard": "9.0.0", "doctrine/coding-standard": "9.0.0",
"jetbrains/phpstorm-stubs": "2021.1", "jetbrains/phpstorm-stubs": "2021.1",
"phpstan/phpstan": "1.3.0", "phpstan/phpstan": "1.4.6",
"phpunit/phpunit": "^7.5.20|^8.5|9.5.11", "phpunit/phpunit": "^7.5.20|^8.5|9.5.16",
"psalm/plugin-phpunit": "0.16.1", "psalm/plugin-phpunit": "0.16.1",
"squizlabs/php_codesniffer": "3.6.2", "squizlabs/php_codesniffer": "3.6.2",
"symfony/cache": "^4.4", "symfony/cache": "^4.4",
"symfony/console": "^2.0.5|^3.0|^4.0|^5.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
"vimeo/psalm": "4.16.1" "vimeo/psalm": "4.22.0"
}, },
"suggest": { "suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files." "symfony/console": "For helpful console commands such as SQL execution and import of files."
@@ -1502,7 +1502,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/dbal/issues", "issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/2.13.7" "source": "https://github.com/doctrine/dbal/tree/2.13.8"
}, },
"funding": [ "funding": [
{ {
@@ -1518,7 +1518,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-06T09:08:04+00:00" "time": "2022-03-09T15:25:46+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
@@ -1750,29 +1750,30 @@
}, },
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
"version": "1.4.0", "version": "1.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/instantiator.git", "url": "https://github.com/doctrine/instantiator.git",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^8.0", "doctrine/coding-standard": "^9",
"ext-pdo": "*", "ext-pdo": "*",
"ext-phar": "*", "ext-phar": "*",
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2", "phpbench/phpbench": "^0.16 || ^1",
"phpstan/phpstan": "^0.12", "phpstan/phpstan": "^1.4",
"phpstan/phpstan-phpunit": "^0.12", "phpstan/phpstan-phpunit": "^1",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"vimeo/psalm": "^4.22"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -1799,7 +1800,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/instantiator/issues", "issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.0" "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
}, },
"funding": [ "funding": [
{ {
@@ -1815,7 +1816,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2020-11-10T18:47:58+00:00" "time": "2022-03-03T08:28:38+00:00"
}, },
{ {
"name": "doctrine/lexer", "name": "doctrine/lexer",
@@ -2281,21 +2282,21 @@
}, },
{ {
"name": "friendsofphp/php-cs-fixer", "name": "friendsofphp/php-cs-fixer",
"version": "v3.6.0", "version": "v3.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
"reference": "1975e4453eb2726d1f50da0ce7fa91295029a4fa" "reference": "7705d5a985132a40282d18a176eb9a4a0497747c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/1975e4453eb2726d1f50da0ce7fa91295029a4fa", "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/7705d5a985132a40282d18a176eb9a4a0497747c",
"reference": "1975e4453eb2726d1f50da0ce7fa91295029a4fa", "reference": "7705d5a985132a40282d18a176eb9a4a0497747c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer/semver": "^3.2", "composer/semver": "^3.2",
"composer/xdebug-handler": "^3.0", "composer/xdebug-handler": "^3.0.3",
"doctrine/annotations": "^1.13", "doctrine/annotations": "^1.13",
"ext-json": "*", "ext-json": "*",
"ext-tokenizer": "*", "ext-tokenizer": "*",
@@ -2307,8 +2308,8 @@
"symfony/finder": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0",
"symfony/options-resolver": "^5.4 || ^6.0", "symfony/options-resolver": "^5.4 || ^6.0",
"symfony/polyfill-mbstring": "^1.23", "symfony/polyfill-mbstring": "^1.23",
"symfony/polyfill-php80": "^1.23", "symfony/polyfill-php80": "^1.25",
"symfony/polyfill-php81": "^1.23", "symfony/polyfill-php81": "^1.25",
"symfony/process": "^5.4 || ^6.0", "symfony/process": "^5.4 || ^6.0",
"symfony/stopwatch": "^5.4 || ^6.0" "symfony/stopwatch": "^5.4 || ^6.0"
}, },
@@ -2358,7 +2359,7 @@
"description": "A tool to automatically fix PHP code style", "description": "A tool to automatically fix PHP code style",
"support": { "support": {
"issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
"source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.6.0" "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.7.0"
}, },
"funding": [ "funding": [
{ {
@@ -2366,7 +2367,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-02-07T18:02:40+00:00" "time": "2022-03-07T16:59:59+00:00"
}, },
{ {
"name": "fruitcake/laravel-cors", "name": "fruitcake/laravel-cors",
@@ -3226,16 +3227,16 @@
}, },
{ {
"name": "laravel/fortify", "name": "laravel/fortify",
"version": "v1.11.1", "version": "v1.11.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/fortify.git", "url": "https://github.com/laravel/fortify.git",
"reference": "eb1d07c849fee750e4cacba969490a72e88211ae" "reference": "35c44f36f2a93fb7d3d8b38d6b7794913c69d414"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/fortify/zipball/eb1d07c849fee750e4cacba969490a72e88211ae", "url": "https://api.github.com/repos/laravel/fortify/zipball/35c44f36f2a93fb7d3d8b38d6b7794913c69d414",
"reference": "eb1d07c849fee750e4cacba969490a72e88211ae", "reference": "35c44f36f2a93fb7d3d8b38d6b7794913c69d414",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3285,20 +3286,20 @@
"issues": "https://github.com/laravel/fortify/issues", "issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify" "source": "https://github.com/laravel/fortify"
}, },
"time": "2022-02-23T15:04:40+00:00" "time": "2022-03-04T20:27:28+00:00"
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v9.2.0", "version": "v9.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "13372872bed31ae75df8709b9de5cde01d50646e" "reference": "29f0aaade82eadd20ef881b4efb88b0dad4e9a5b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/13372872bed31ae75df8709b9de5cde01d50646e", "url": "https://api.github.com/repos/laravel/framework/zipball/29f0aaade82eadd20ef881b4efb88b0dad4e9a5b",
"reference": "13372872bed31ae75df8709b9de5cde01d50646e", "reference": "29f0aaade82eadd20ef881b4efb88b0dad4e9a5b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3384,7 +3385,7 @@
"mockery/mockery": "^1.4.4", "mockery/mockery": "^1.4.4",
"orchestra/testbench-core": "^7.1", "orchestra/testbench-core": "^7.1",
"pda/pheanstalk": "^4.0", "pda/pheanstalk": "^4.0",
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.4.7",
"phpunit/phpunit": "^9.5.8", "phpunit/phpunit": "^9.5.8",
"predis/predis": "^1.1.9", "predis/predis": "^1.1.9",
"symfony/cache": "^6.0" "symfony/cache": "^6.0"
@@ -3464,7 +3465,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2022-02-22T15:30:23+00:00" "time": "2022-03-08T16:17:00+00:00"
}, },
{ {
"name": "laravel/sanctum", "name": "laravel/sanctum",
@@ -4047,16 +4048,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.0.10", "version": "3.0.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "bbc5026adb5a423dfcdcecec74c7e15943ff6115" "reference": "1ca148713c23cadeb9d7526973f81fb4a04090a3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/bbc5026adb5a423dfcdcecec74c7e15943ff6115", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1ca148713c23cadeb9d7526973f81fb4a04090a3",
"reference": "bbc5026adb5a423dfcdcecec74c7e15943ff6115", "reference": "1ca148713c23cadeb9d7526973f81fb4a04090a3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4117,7 +4118,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.0.10" "source": "https://github.com/thephpleague/flysystem/tree/3.0.11"
}, },
"funding": [ "funding": [
{ {
@@ -4133,20 +4134,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-26T11:09:13+00:00" "time": "2022-03-04T16:40:17+00:00"
}, },
{ {
"name": "league/flysystem-aws-s3-v3", "name": "league/flysystem-aws-s3-v3",
"version": "3.0.10", "version": "3.0.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
"reference": "79c63dc761b6a389a38bd409c2bf8ced73c29261" "reference": "6f78e668ee70c69dd43830ebb21b41ec11f648fc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/79c63dc761b6a389a38bd409c2bf8ced73c29261", "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/6f78e668ee70c69dd43830ebb21b41ec11f648fc",
"reference": "79c63dc761b6a389a38bd409c2bf8ced73c29261", "reference": "6f78e668ee70c69dd43830ebb21b41ec11f648fc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4187,9 +4188,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues",
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.0.10" "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.0.11"
}, },
"time": "2022-02-26T10:59:05+00:00" "time": "2022-03-04T16:39:25+00:00"
}, },
{ {
"name": "league/mime-type-detection", "name": "league/mime-type-detection",
@@ -4739,28 +4740,29 @@
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.10.2", "version": "1.11.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"replace": { "conflict": {
"myclabs/deep-copy": "self.version" "doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3,<3.2.2"
}, },
"require-dev": { "require-dev": {
"doctrine/collections": "^1.0", "doctrine/collections": "^1.6.8",
"doctrine/common": "^2.6", "doctrine/common": "^2.13.3 || ^3.2.2",
"phpunit/phpunit": "^7.1" "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -4785,7 +4787,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/myclabs/DeepCopy/issues", "issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
}, },
"funding": [ "funding": [
{ {
@@ -4793,7 +4795,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2020-11-13T09:40:50+00:00" "time": "2022-03-03T13:19:32+00:00"
}, },
{ {
"name": "myclabs/php-enum", "name": "myclabs/php-enum",
@@ -5924,16 +5926,16 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.14", "version": "9.2.15",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4" "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f4d60b6afe5546421462b76cd4e633ebc364ab4", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4", "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5989,7 +5991,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.14" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
}, },
"funding": [ "funding": [
{ {
@@ -5997,7 +5999,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-02-28T12:38:02+00:00" "time": "2022-03-07T09:28:20+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@@ -6242,16 +6244,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.5.16", "version": "9.5.18",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc" "reference": "1b5856028273bfd855e60a887278857d872ec67a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1b5856028273bfd855e60a887278857d872ec67a",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc", "reference": "1b5856028273bfd855e60a887278857d872ec67a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -6329,7 +6331,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.18"
}, },
"funding": [ "funding": [
{ {
@@ -6341,7 +6343,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-02-23T17:10:58+00:00" "time": "2022-03-08T06:52:28+00:00"
}, },
{ {
"name": "pragmarx/google2fa", "name": "pragmarx/google2fa",
@@ -9119,16 +9121,16 @@
}, },
{ {
"name": "spatie/laravel-backup", "name": "spatie/laravel-backup",
"version": "8.0.8", "version": "8.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/laravel-backup.git", "url": "https://github.com/spatie/laravel-backup.git",
"reference": "1e6e06cf75f6df21311a96fa99d767ff2c50078c" "reference": "1a546127205b9afcb8e0dee6de7f2ff93f927ea4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-backup/zipball/1e6e06cf75f6df21311a96fa99d767ff2c50078c", "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/1a546127205b9afcb8e0dee6de7f2ff93f927ea4",
"reference": "1e6e06cf75f6df21311a96fa99d767ff2c50078c", "reference": "1a546127205b9afcb8e0dee6de7f2ff93f927ea4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9155,7 +9157,7 @@
"league/flysystem-aws-s3-v3": "^2.0|^3.0", "league/flysystem-aws-s3-v3": "^2.0|^3.0",
"mockery/mockery": "^1.4", "mockery/mockery": "^1.4",
"orchestra/testbench": "^7.0", "orchestra/testbench": "^7.0",
"phpunit/phpunit": "^9.5.4" "pestphp/pest": "^1.20"
}, },
"suggest": { "suggest": {
"laravel/slack-notification-channel": "Required for sending notifications via Slack" "laravel/slack-notification-channel": "Required for sending notifications via Slack"
@@ -9198,7 +9200,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/spatie/laravel-backup/issues", "issues": "https://github.com/spatie/laravel-backup/issues",
"source": "https://github.com/spatie/laravel-backup/tree/8.0.8" "source": "https://github.com/spatie/laravel-backup/tree/8.1.1"
}, },
"funding": [ "funding": [
{ {
@@ -9210,7 +9212,7 @@
"type": "other" "type": "other"
} }
], ],
"time": "2022-02-23T18:35:41+00:00" "time": "2022-03-08T10:23:50+00:00"
}, },
{ {
"name": "spatie/laravel-package-tools", "name": "spatie/laravel-package-tools",
@@ -9756,16 +9758,16 @@
}, },
{ {
"name": "stripe/stripe-php", "name": "stripe/stripe-php",
"version": "v7.115.0", "version": "v7.116.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/stripe/stripe-php.git", "url": "https://github.com/stripe/stripe-php.git",
"reference": "a1c528a5076b80dc156601505994870d23313a73" "reference": "7a39f594f213ed3f443a95adf769d1ecbc8393e7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/stripe/stripe-php/zipball/a1c528a5076b80dc156601505994870d23313a73", "url": "https://api.github.com/repos/stripe/stripe-php/zipball/7a39f594f213ed3f443a95adf769d1ecbc8393e7",
"reference": "a1c528a5076b80dc156601505994870d23313a73", "reference": "7a39f594f213ed3f443a95adf769d1ecbc8393e7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -9810,9 +9812,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/stripe/stripe-php/issues", "issues": "https://github.com/stripe/stripe-php/issues",
"source": "https://github.com/stripe/stripe-php/tree/v7.115.0" "source": "https://github.com/stripe/stripe-php/tree/v7.116.0"
}, },
"time": "2022-03-01T22:45:01+00:00" "time": "2022-03-02T15:51:15+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
@@ -10276,16 +10278,16 @@
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v6.0.5", "version": "v6.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "6646c13f787057d64701a3a0235cf9567c6ccbbd" "reference": "52b888523545b0b4049ab9ce48766802484d7046"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/6646c13f787057d64701a3a0235cf9567c6ccbbd", "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b888523545b0b4049ab9ce48766802484d7046",
"reference": "6646c13f787057d64701a3a0235cf9567c6ccbbd", "reference": "52b888523545b0b4049ab9ce48766802484d7046",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10319,7 +10321,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v6.0.5" "source": "https://github.com/symfony/filesystem/tree/v6.0.6"
}, },
"funding": [ "funding": [
{ {
@@ -10335,7 +10337,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-28T07:42:30+00:00" "time": "2022-03-02T12:58:14+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
@@ -10562,16 +10564,16 @@
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v6.0.5", "version": "v6.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "b460fb15905eef449c4c43a4f0c113eccee103b9" "reference": "a000fcf2298a1bc79a1dcff22608792506534719"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/b460fb15905eef449c4c43a4f0c113eccee103b9", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a000fcf2298a1bc79a1dcff22608792506534719",
"reference": "b460fb15905eef449c4c43a4f0c113eccee103b9", "reference": "a000fcf2298a1bc79a1dcff22608792506534719",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10614,7 +10616,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v6.0.5" "source": "https://github.com/symfony/http-foundation/tree/v6.0.6"
}, },
"funding": [ "funding": [
{ {
@@ -10630,20 +10632,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-21T17:15:17+00:00" "time": "2022-03-05T21:04:00+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v6.0.5", "version": "v6.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "5ad3f5e5fa772a8b5c6bb217f8379b533afac2ba" "reference": "f9e49ad9fe16895b24cd7a09dc28d3364282e21a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/5ad3f5e5fa772a8b5c6bb217f8379b533afac2ba", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9e49ad9fe16895b24cd7a09dc28d3364282e21a",
"reference": "5ad3f5e5fa772a8b5c6bb217f8379b533afac2ba", "reference": "f9e49ad9fe16895b24cd7a09dc28d3364282e21a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -10723,7 +10725,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v6.0.5" "source": "https://github.com/symfony/http-kernel/tree/v6.0.6"
}, },
"funding": [ "funding": [
{ {
@@ -10739,7 +10741,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-28T08:05:03+00:00" "time": "2022-03-05T21:19:20+00:00"
}, },
{ {
"name": "symfony/mailer", "name": "symfony/mailer",
@@ -11030,7 +11032,7 @@
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git", "url": "https://github.com/symfony/polyfill-ctype.git",
@@ -11092,7 +11094,7 @@
"portable" "portable"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11112,7 +11114,7 @@
}, },
{ {
"name": "symfony/polyfill-intl-grapheme", "name": "symfony/polyfill-intl-grapheme",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
@@ -11173,7 +11175,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11193,7 +11195,7 @@
}, },
{ {
"name": "symfony/polyfill-intl-idn", "name": "symfony/polyfill-intl-idn",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git", "url": "https://github.com/symfony/polyfill-intl-idn.git",
@@ -11260,7 +11262,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11280,7 +11282,7 @@
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
@@ -11344,7 +11346,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11364,7 +11366,7 @@
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
@@ -11427,7 +11429,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11447,7 +11449,7 @@
}, },
{ {
"name": "symfony/polyfill-php72", "name": "symfony/polyfill-php72",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php72.git", "url": "https://github.com/symfony/polyfill-php72.git",
@@ -11503,7 +11505,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11523,16 +11525,16 @@
}, },
{ {
"name": "symfony/polyfill-php80", "name": "symfony/polyfill-php80",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php80.git", "url": "https://github.com/symfony/polyfill-php80.git",
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -11586,7 +11588,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -11602,11 +11604,11 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-09-13T13:58:33+00:00" "time": "2022-03-04T08:16:47+00:00"
}, },
{ {
"name": "symfony/polyfill-php81", "name": "symfony/polyfill-php81",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php81.git", "url": "https://github.com/symfony/polyfill-php81.git",
@@ -11665,7 +11667,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {
@@ -12216,16 +12218,16 @@
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v6.0.5", "version": "v6.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "e69501c71107cc3146b32aaa45f4edd0c3427875" "reference": "f6639cb9b5e0c57fe31e3263b900a77eedb0c908"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/e69501c71107cc3146b32aaa45f4edd0c3427875", "url": "https://api.github.com/repos/symfony/translation/zipball/f6639cb9b5e0c57fe31e3263b900a77eedb0c908",
"reference": "e69501c71107cc3146b32aaa45f4edd0c3427875", "reference": "f6639cb9b5e0c57fe31e3263b900a77eedb0c908",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12291,7 +12293,7 @@
"description": "Provides tools to internationalize your application", "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/translation/tree/v6.0.5" "source": "https://github.com/symfony/translation/tree/v6.0.6"
}, },
"funding": [ "funding": [
{ {
@@ -12307,7 +12309,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-09T15:52:48+00:00" "time": "2022-03-02T12:58:14+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
@@ -12389,16 +12391,16 @@
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v6.0.5", "version": "v6.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "60d6a756d5f485df5e6e40b337334848f79f61ce" "reference": "38358405ae948963c50a3aae3dfea598223ba15e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/60d6a756d5f485df5e6e40b337334848f79f61ce", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38358405ae948963c50a3aae3dfea598223ba15e",
"reference": "60d6a756d5f485df5e6e40b337334848f79f61ce", "reference": "38358405ae948963c50a3aae3dfea598223ba15e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12457,7 +12459,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v6.0.5" "source": "https://github.com/symfony/var-dumper/tree/v6.0.6"
}, },
"funding": [ "funding": [
{ {
@@ -12473,7 +12475,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-21T17:15:17+00:00" "time": "2022-03-02T12:58:14+00:00"
}, },
{ {
"name": "teamtnt/tntsearch", "name": "teamtnt/tntsearch",
@@ -12844,16 +12846,16 @@
}, },
{ {
"name": "voku/portable-ascii", "name": "voku/portable-ascii",
"version": "2.0.0", "version": "2.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/voku/portable-ascii.git", "url": "https://github.com/voku/portable-ascii.git",
"reference": "9bd89e83cecdf8c37b64909454249eaed98b2c89" "reference": "b56450eed252f6801410d810c8e1727224ae0743"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/voku/portable-ascii/zipball/9bd89e83cecdf8c37b64909454249eaed98b2c89", "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
"reference": "9bd89e83cecdf8c37b64909454249eaed98b2c89", "reference": "b56450eed252f6801410d810c8e1727224ae0743",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -12890,7 +12892,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/voku/portable-ascii/issues", "issues": "https://github.com/voku/portable-ascii/issues",
"source": "https://github.com/voku/portable-ascii/tree/2.0.0" "source": "https://github.com/voku/portable-ascii/tree/2.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -12914,7 +12916,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-24T18:59:03+00:00" "time": "2022-03-08T17:03:00+00:00"
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",
@@ -13029,21 +13031,21 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "barryvdh/laravel-ide-helper", "name": "barryvdh/laravel-ide-helper",
"version": "v2.12.1", "version": "v2.12.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/barryvdh/laravel-ide-helper.git", "url": "https://github.com/barryvdh/laravel-ide-helper.git",
"reference": "999167d4c21e2ae748847f7c0e4565ae45f5c9f9" "reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/999167d4c21e2ae748847f7c0e4565ae45f5c9f9", "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/3ba1e2573b38f72107b8aacc4ee177fcab30a550",
"reference": "999167d4c21e2ae748847f7c0e4565ae45f5c9f9", "reference": "3ba1e2573b38f72107b8aacc4ee177fcab30a550",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"barryvdh/reflection-docblock": "^2.0.6", "barryvdh/reflection-docblock": "^2.0.6",
"composer/composer": "^1.10.23 || ^2.1.9", "composer/pcre": "^1 || ^2 || ^3",
"doctrine/dbal": "^2.6 || ^3", "doctrine/dbal": "^2.6 || ^3",
"ext-json": "*", "ext-json": "*",
"illuminate/console": "^8 || ^9", "illuminate/console": "^8 || ^9",
@@ -13107,7 +13109,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/barryvdh/laravel-ide-helper/issues", "issues": "https://github.com/barryvdh/laravel-ide-helper/issues",
"source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.1" "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v2.12.3"
}, },
"funding": [ "funding": [
{ {
@@ -13119,7 +13121,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-01-24T21:36:43+00:00" "time": "2022-03-06T14:33:42+00:00"
}, },
{ {
"name": "barryvdh/reflection-docblock", "name": "barryvdh/reflection-docblock",
@@ -13255,12 +13257,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/composer.git", "url": "https://github.com/composer/composer.git",
"reference": "575fbfb53fcc2388916d554271c99c8281fea782" "reference": "ae23647f07932754dc9d7fd1d15657273301a009"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/composer/zipball/575fbfb53fcc2388916d554271c99c8281fea782", "url": "https://api.github.com/repos/composer/composer/zipball/ae23647f07932754dc9d7fd1d15657273301a009",
"reference": "575fbfb53fcc2388916d554271c99c8281fea782", "reference": "ae23647f07932754dc9d7fd1d15657273301a009",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -13353,7 +13355,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-26T13:12:30+00:00" "time": "2022-03-09T19:45:19+00:00"
}, },
{ {
"name": "composer/metadata-minifier", "name": "composer/metadata-minifier",
@@ -14323,16 +14325,16 @@
}, },
{ {
"name": "spatie/ignition", "name": "spatie/ignition",
"version": "1.1.0", "version": "1.2.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/spatie/ignition.git", "url": "https://github.com/spatie/ignition.git",
"reference": "8ecde033600064e3ffdbf804deec0dcb05004387" "reference": "ab8d1f938d3ffd20af25ad788a9d019e1123068c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/spatie/ignition/zipball/8ecde033600064e3ffdbf804deec0dcb05004387", "url": "https://api.github.com/repos/spatie/ignition/zipball/ab8d1f938d3ffd20af25ad788a9d019e1123068c",
"reference": "8ecde033600064e3ffdbf804deec0dcb05004387", "reference": "ab8d1f938d3ffd20af25ad788a9d019e1123068c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -14390,7 +14392,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-03-01T17:01:33+00:00" "time": "2022-03-08T15:12:58+00:00"
}, },
{ {
"name": "spatie/laravel-ignition", "name": "spatie/laravel-ignition",
@@ -14481,7 +14483,7 @@
}, },
{ {
"name": "symfony/polyfill-php73", "name": "symfony/polyfill-php73",
"version": "v1.24.0", "version": "v1.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php73.git", "url": "https://github.com/symfony/polyfill-php73.git",
@@ -14540,7 +14542,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.24.0" "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0"
}, },
"funding": [ "funding": [
{ {

6
package-lock.json generated
View File

@@ -6657,9 +6657,9 @@
} }
}, },
"postcss": { "postcss": {
"version": "8.4.7", "version": "8.4.8",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.8.tgz",
"integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", "integrity": "sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"nanoid": "^3.3.1", "nanoid": "^3.3.1",

View File

@@ -15,7 +15,7 @@
"cross-env": "^5.1", "cross-env": "^5.1",
"laravel-echo": "^1.11.3", "laravel-echo": "^1.11.3",
"laravel-mix": "^6.0.43", "laravel-mix": "^6.0.43",
"postcss": "^8.4.7", "postcss": "^8.4.8",
"prettier": "^2.5.1", "prettier": "^2.5.1",
"prettier-plugin-import-sort": "0.0.7", "prettier-plugin-import-sort": "0.0.7",
"prettier-plugin-tailwindcss": "^0.1.8", "prettier-plugin-tailwindcss": "^0.1.8",

View File

@@ -1,7 +1,7 @@
{ {
"/js/main.js": "/js/main.js", "/js/main.js": "/js/main.js",
"/chunks/request.js": "/chunks/request.js?id=3c8d8ec8f0f51d19", "/chunks/request.js": "/chunks/request.js?id=001f737452e0d25a",
"/chunks/request-upload.js": "/chunks/request-upload.js?id=12dcae76203db76f", "/chunks/request-upload.js": "/chunks/request-upload.js?id=f50a50d2aa741c81",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=19a0784e59d768ec", "/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=19a0784e59d768ec",
"/chunks/status-check.js": "/chunks/status-check.js?id=6bae83a7e38d3b1c", "/chunks/status-check.js": "/chunks/status-check.js?id=6bae83a7e38d3b1c",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=0d001d4505d2f5e9", "/chunks/purchase-code.js": "/chunks/purchase-code.js?id=0d001d4505d2f5e9",
@@ -9,13 +9,13 @@
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=c58071cb9d14e595", "/chunks/environment-setup.js": "/chunks/environment-setup.js?id=c58071cb9d14e595",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=ad92e971daa0f86d", "/chunks/app-setup.js": "/chunks/app-setup.js?id=ad92e971daa0f86d",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=286b9872565b5e96", "/chunks/admin-account.js": "/chunks/admin-account.js?id=286b9872565b5e96",
"/chunks/shared.js": "/chunks/shared.js?id=e777e8e40fdc11a0", "/chunks/shared.js": "/chunks/shared.js?id=584d7de11142b545",
"/chunks/shared/browser.js": "/chunks/shared/browser.js?id=ca4620238e883070", "/chunks/shared/browser.js": "/chunks/shared/browser.js?id=4722af71c3c7bba6",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=3af02b5d9d4da341", "/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=f60d6a95bc180df2",
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=92c75a6c77689046", "/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=92c75a6c77689046",
"/chunks/not-found.js": "/chunks/not-found.js?id=36763aa314e00327", "/chunks/not-found.js": "/chunks/not-found.js?id=36763aa314e00327",
"/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=a3906226272982b1", "/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=a3906226272982b1",
"/chunks/admin.js": "/chunks/admin.js?id=dfda0fb3e01450de", "/chunks/admin.js": "/chunks/admin.js?id=920613c2b7236639",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=e7c6001687e641eb", "/chunks/dashboard.js": "/chunks/dashboard.js?id=e7c6001687e641eb",
"/chunks/invoices.js": "/chunks/invoices.js?id=85fd4514d3d85a71", "/chunks/invoices.js": "/chunks/invoices.js?id=85fd4514d3d85a71",
"/chunks/subscriptions.js": "/chunks/subscriptions.js?id=9f970bdfc7583080", "/chunks/subscriptions.js": "/chunks/subscriptions.js?id=9f970bdfc7583080",
@@ -57,18 +57,18 @@
"/chunks/sign-up.js": "/chunks/sign-up.js?id=098d7f41b85066bf", "/chunks/sign-up.js": "/chunks/sign-up.js?id=098d7f41b85066bf",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=d6193ed0b07e7957", "/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=d6193ed0b07e7957",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=d00212636148a14b", "/chunks/create-new-password.js": "/chunks/create-new-password.js?id=d00212636148a14b",
"/chunks/settings.js": "/chunks/settings.js?id=fa7076424e651555", "/chunks/settings.js": "/chunks/settings.js?id=f4a7bce3ff4c61a9",
"/chunks/profile.js": "/chunks/profile.js?id=1217f457145491ec", "/chunks/profile.js": "/chunks/profile.js?id=1217f457145491ec",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=b6704f4cbf14c67d", "/chunks/settings-password.js": "/chunks/settings-password.js?id=b6704f4cbf14c67d",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=90ba712f3728443b", "/chunks/settings-storage.js": "/chunks/settings-storage.js?id=90ba712f3728443b",
"/chunks/billing.js": "/chunks/billing.js?id=27957f2477fdd121", "/chunks/billing.js": "/chunks/billing.js?id=27957f2477fdd121",
"/chunks/platform.js": "/chunks/platform.js?id=863924b804b662c2", "/chunks/platform.js": "/chunks/platform.js?id=85ee6709fe4e3b7e",
"/chunks/files.js": "/chunks/files.js?id=823d196884eda435", "/chunks/files.js": "/chunks/files.js?id=0d4e7a1330328eae",
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=72d3b7d6c875f671", "/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=2362f8fa4e3392e9",
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=19b49de44403b4be", "/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=25e9d29dd3c29338",
"/chunks/trash.js": "/chunks/trash.js?id=2a7999f7c6ba14cd", "/chunks/trash.js": "/chunks/trash.js?id=5bc0e04ada660232",
"/chunks/team-folders.js": "/chunks/team-folders.js?id=b8c53410effac0d0", "/chunks/team-folders.js": "/chunks/team-folders.js?id=cf60b121819ca1a5",
"/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=47b3d9874299d8cb", "/chunks/shared-with-me.js": "/chunks/shared-with-me.js?id=bdbbd7e2225a6db9",
"/chunks/invitation.js": "/chunks/invitation.js?id=e3f3c2e3501c5a63", "/chunks/invitation.js": "/chunks/invitation.js?id=e3f3c2e3501c5a63",
"/css/tailwind.css": "/css/tailwind.css", "/css/tailwind.css": "/css/tailwind.css",
"/css/app.css": "/css/app.css" "/css/app.css": "/css/app.css"

View File

@@ -1,69 +1,106 @@
<template> <template>
<article class="z-20 relative flex items-start p-2.5 mb-1.5 space-x-4 rounded-xl dark:hover:bg-4x-dark-foreground hover:bg-light-background bg-opacity-80"> <article
class="delay-[3000ms] duration-700 transition-all relative z-20 mb-1.5 flex items-start space-x-4 rounded-xl p-2.5 dark:hover:bg-4x-dark-foreground"
:class="{'bg-light-background/80': isUnread}"
>
<user-plus-icon
v-if="notification.data.attributes.type === 'team-invitation'"
size="20"
class="vue-feather text-theme shrink-0"
/>
<upload-cloud-icon
v-if="['file-request', 'remote-upload-done'].includes(notification.data.attributes.type)"
size="20"
class="vue-feather text-theme shrink-0"
/>
<user-plus-icon v-if="notification.type === 'team-invitation'" size="20" class="vue-feather text-theme shrink-0" /> <div>
<upload-cloud-icon v-if="['file-request', 'remote-upload-done'].includes(notification.type)" size="20" class="vue-feather text-theme shrink-0" /> <b class="mb-1.5 block text-sm font-extrabold">
{{ notification.data.attributes.title }}
</b>
<div> <p class="mb-1.5 text-sm dark:text-gray-500">
<b class="font-extrabold text-sm mb-1.5 block"> {{ notification.data.attributes.description }}
{{ notification.title }} </p>
</b>
<p class="text-sm mb-1.5 dark:text-gray-500"> <div class="mb-4 flex items-center">
{{ notification.description }} <!--<MemberAvatar class="mr-2" :size="22" :is-border="false" :member="user" />-->
</p> <time class="block text-xs text-gray-400 dark:text-gray-400">
{{ notification.data.attributes.created_at }}
</time>
</div>
<div class="flex items-center mb-4"> <!--Accept or decline team invitation-->
<!--<MemberAvatar class="mr-2" :size="22" :is-border="false" :member="user" />--> <div v-if="notification.data.attributes.type === 'team-invitation'" class="flex items-center space-x-3">
<time class=" block text-xs dark:text-gray-400 text-gray-400"> <div
09. Mar. 2022, 08:27 class="flex cursor-pointer items-center rounded-xl py-1.5 px-2 transition-colors hover:bg-green-100 dark:hover:bg-green-900"
</time> >
</div> <check-icon size="16" class="vue-feather mr-2 text-green-600 dark:text-green-600" />
<span class="text-sm font-bold text-green-600 dark:text-green-600">
{{ $t('Accept') }}
</span>
</div>
<!--Accept or decline team invitation--> <div
<div v-if="notification.type === 'team-invitation'" class="flex items-center space-x-3"> class="flex cursor-pointer items-center rounded-xl py-1.5 px-2 transition-colors hover:bg-rose-100 dark:hover:bg-rose-900"
<div class="flex items-center cursor-pointer py-1.5 px-2 rounded-xl transition-colors dark:hover:bg-green-900 hover:bg-green-100"> >
<check-icon size="16" class="vue-feather dark:text-green-600 text-green-600 mr-2" /> <x-icon size="16" class="vue-feather mr-2 text-rose-600 dark:text-rose-600" />
<span class="text-sm font-bold dark:text-green-600 text-green-600"> <span class="text-sm font-bold text-rose-600 dark:text-rose-600">
{{ $t('Accept') }} {{ $t('Decline') }}
</span> </span>
</div> </div>
</div>
<div class="flex items-center cursor-pointer py-1.5 px-2 rounded-xl transition-colors dark:hover:bg-rose-900 hover:bg-rose-100"> <!--Go to route-->
<x-icon size="16" class="vue-feather dark:text-rose-600 text-rose-600 mr-2" /> <router-link
<span class="text-sm font-bold dark:text-rose-600 text-rose-600"> @click.native="closeCenter"
{{ $t('Decline') }} v-if="action && action.type === 'route'"
</span> :to="{ name: action.params.route, params: { id: action.params.id } }"
</div> class="mt-4 flex items-center"
</div> >
<span class="mr-2 whitespace-nowrap text-xs font-bold">
<!--Go to route--> {{ action.params.button }}
<router-link v-if="['file-request', 'remote-upload-done'].includes(notification.type)" :to="{ name: 'Users' }" class="mt-4 flex items-center"> </span>
<span class="mr-2 whitespace-nowrap text-xs font-bold"> <chevron-right-icon size="16" class="text-theme vue-feather" />
{{ $t('Show Files') }} </router-link>
</span> </div>
<chevron-right-icon size="16" class="text-theme vue-feather" /> </article>
</router-link>
</div>
</article>
</template> </template>
<script> <script>
import {CheckIcon, XIcon, MailIcon, UserPlusIcon, UploadCloudIcon, ChevronRightIcon} from 'vue-feather-icons' import { CheckIcon, XIcon, MailIcon, UserPlusIcon, UploadCloudIcon, ChevronRightIcon } from 'vue-feather-icons'
import MemberAvatar from '../FilesView/MemberAvatar' import MemberAvatar from '../FilesView/MemberAvatar'
export default { export default {
name: 'Notification', name: 'Notification',
props: [ props: ['notification'],
'notification', components: {
], MemberAvatar,
components: { ChevronRightIcon,
MemberAvatar, UploadCloudIcon,
ChevronRightIcon, UserPlusIcon,
UploadCloudIcon, CheckIcon,
UserPlusIcon, MailIcon,
CheckIcon, XIcon,
MailIcon, },
XIcon, computed: {
action() {
return this.notification.data.attributes.action
},
},
data() {
return {
isUnread: false
}
},
methods: {
closeCenter() {
this.$store.commit('TOGGLE_NOTIFICATION_CENTER')
},
},
created() {
this.isUnread = this.notification.data.attributes.read_at === null
setTimeout(() => this.isUnread = false, 1000)
} }
} }
</script> </script>

View File

@@ -3,7 +3,7 @@
<div class="fixed popup z-20 top-[27px] bottom-[27px] left-20 w-[360px]"> <div class="fixed popup z-20 top-[27px] bottom-[27px] left-20 w-[360px]">
<!--Triangle--> <!--Triangle-->
<div class="z-20 absolute left-0 top-[102px] w-4 translate-x-[-15px] overflow-hidden inline-block"> <div class="z-20 absolute left-0 top-[64px] w-4 translate-x-[-15px] overflow-hidden inline-block" :class="{'!top-[102px]': config.subscriptionType === 'metered'}">
<div class="h-12 -rotate-45 transform origin-top-right dark:bg-2x-dark-foreground bg-white bg-opacity-80 backdrop-blur-2xl"></div> <div class="h-12 -rotate-45 transform origin-top-right dark:bg-2x-dark-foreground bg-white bg-opacity-80 backdrop-blur-2xl"></div>
</div> </div>
@@ -15,22 +15,26 @@
</b> </b>
<div class="px-2.5"> <div class="px-2.5">
<MobileActionButton icon="check-square" class="mb-2 dark:!bg-4x-dark-foreground"> <MobileActionButton v-if="readNotifications.length || unreadNotifications.length" @click.native="deleteAllNotifications" icon="check-square" class="mb-2 dark:!bg-4x-dark-foreground">
{{ $t('Clear all') }} {{ $t('Clear all') }}
</MobileActionButton> </MobileActionButton>
<p v-if="!readNotifications.length && !unreadNotifications.length" class="text-sm mt-8">
{{ $t("There aren't any notifications.") }}
</p>
</div> </div>
<b class="dark-text-theme mt-1.5 block px-2.5 mb-2.5 text-xs text-gray-400"> <b v-if="unreadNotifications.length" class="dark-text-theme mt-1.5 block px-2.5 mb-2.5 text-xs text-gray-400">
Today {{ $t('Unread') }}
</b> </b>
<Notification :notification="notification" v-for="notification in todayNotifications" :key="notification.id" /> <Notification :notification="notification" v-for="notification in unreadNotifications" :key="notification.id" />
<b class="dark-text-theme mt-2.5 block px-2.5 mb-2.5 text-xs text-gray-400"> <b v-if="readNotifications.length" class="dark-text-theme mt-2.5 block px-2.5 mb-2.5 text-xs text-gray-400">
Later {{ $t('Read') }}
</b> </b>
<Notification :notification="notification" v-for="notification in laterNotifications" :key="notification.id" /> <Notification :notification="notification" v-for="notification in readNotifications" :key="notification.id" />
</div> </div>
</div> </div>
</transition> </transition>
@@ -39,6 +43,7 @@
<script> <script>
import Notification from "./Notification"; import Notification from "./Notification";
import MobileActionButton from "../FilesView/MobileActionButton"; import MobileActionButton from "../FilesView/MobileActionButton";
import {mapGetters} from "vuex";
export default { export default {
name: 'NotificationCenter', name: 'NotificationCenter',
@@ -46,6 +51,27 @@ export default {
MobileActionButton, MobileActionButton,
Notification Notification
}, },
watch: {
isVisibleNotificationCenter: function (visibility) {
if (visibility) {
axios.post('/api/user/notifications/read')
.then(() => {
this.$store.commit('UPDATE_NOTIFICATION_COUNT', 0)
})
}
}
},
computed: {
...mapGetters([
'user', 'config', 'isVisibleNotificationCenter',
]),
readNotifications() {
return this.user.data.relationships.readNotifications.data
},
unreadNotifications() {
return this.user.data.relationships.unreadNotifications.data
}
},
data() { data() {
return { return {
laterNotifications: [ laterNotifications: [
@@ -86,6 +112,14 @@ export default {
}, },
] ]
} }
},
methods: {
deleteAllNotifications() {
axios.delete('/api/user/notifications')
.then(() => {
this.$store.commit('FLUSH_NOTIFICATIONS')
})
}
} }
} }
</script> </script>

View File

@@ -22,7 +22,7 @@
<!--Navigation--> <!--Navigation-->
<div class="mt-2 relative"> <div class="mt-2 relative">
<div @click="toggleNotificationCenter" class="relative button-icon inline-block cursor-pointer rounded-xl p-3 hover:bg-light-300 dark:hover:bg-4x-dark-foreground"> <div @click="$store.commit('TOGGLE_NOTIFICATION_CENTER')" class="relative button-icon inline-block cursor-pointer rounded-xl p-3 hover:bg-light-300 dark:hover:bg-4x-dark-foreground">
<bell-icon size="18" class="transition" :class="{'rotate-[30deg]': notificationCount}" /> <bell-icon size="18" class="transition" :class="{'rotate-[30deg]': notificationCount}" />
<span v-if="notificationCount" class="absolute z-[9] right-1.5 bottom-1.5 flex items-center justify-center w-4 h-4 bg-theme text-white rounded-full text-xs font-bold"> <span v-if="notificationCount" class="absolute z-[9] right-1.5 bottom-1.5 flex items-center justify-center w-4 h-4 bg-theme text-white rounded-full text-xs font-bold">
{{ notificationCount }} {{ notificationCount }}
@@ -31,7 +31,7 @@
</div> </div>
</div> </div>
<NotificationCenter v-show="isNotificationCenter" /> <NotificationCenter v-show="isVisibleNotificationCenter" />
<!--Navigation--> <!--Navigation-->
<div class="mt-6"> <div class="mt-6">
@@ -97,7 +97,7 @@ export default {
SunIcon, SunIcon,
}, },
computed: { computed: {
...mapGetters(['isVisibleNavigationBars', 'isDarkMode', 'config', 'user']), ...mapGetters(['isVisibleNavigationBars', 'isDarkMode', 'config', 'user', 'isVisibleNotificationCenter', 'notificationCount']),
navigation() { navigation() {
if (this.user.data.attributes.role === 'admin') { if (this.user.data.attributes.role === 'admin') {
return [ return [
@@ -140,15 +140,10 @@ export default {
}, },
data() { data() {
return { return {
notificationCount: 2,
isNotificationCenter: false, isNotificationCenter: false,
} }
}, },
methods: { methods: {
toggleNotificationCenter() {
this.notificationCount = 0
this.isNotificationCenter = ! this.isNotificationCenter
},
isSection(section) { isSection(section) {
return this.$route.matched[0].name === section return this.$route.matched[0].name === section
}, },

View File

@@ -5,6 +5,8 @@ import router from '../../router'
const defaultState = { const defaultState = {
isVisibleNavigationBars: localStorage.getItem('is_navigation_bars') !== 'false', isVisibleNavigationBars: localStorage.getItem('is_navigation_bars') !== 'false',
isVisibleNotificationCenter: false,
notificationCount: 0,
isDarkMode: false, isDarkMode: false,
isVisibleSidebar: localStorage.getItem('file_info_visibility') === 'true' || false, isVisibleSidebar: localStorage.getItem('file_info_visibility') === 'true' || false,
itemViewType: localStorage.getItem('preview_type') || 'list', itemViewType: localStorage.getItem('preview_type') || 'list',
@@ -167,10 +169,18 @@ const mutations = {
UPDATE_DARK_MODE_STATUS(state, val) { UPDATE_DARK_MODE_STATUS(state, val) {
state.isDarkMode = val state.isDarkMode = val
}, },
UPDATE_NOTIFICATION_COUNT(state, val) {
state.notificationCount = val
},
TOGGLE_NOTIFICATION_CENTER(state) {
state.isVisibleNotificationCenter = !state.isVisibleNotificationCenter
},
} }
const getters = { const getters = {
isVisibleNotificationCenter: (state) => state.isVisibleNotificationCenter,
isVisibleNavigationBars: (state) => state.isVisibleNavigationBars, isVisibleNavigationBars: (state) => state.isVisibleNavigationBars,
notificationCount: (state) => state.notificationCount,
isVisibleSidebar: (state) => state.isVisibleSidebar, isVisibleSidebar: (state) => state.isVisibleSidebar,
itemViewType: (state) => state.itemViewType, itemViewType: (state) => state.itemViewType,
requestedPlan: (state) => state.requestedPlan, requestedPlan: (state) => state.requestedPlan,

View File

@@ -3,14 +3,15 @@ const defaultState = {
} }
const actions = { const actions = {
runConnection: ({ commit, getters }) => { runConnection: ({ commit, getters, dispatch }) => {
commit('SET_RUNNING_COMMUNICATION') commit('SET_RUNNING_COMMUNICATION')
Echo.private(`test.${getters.user.data.id}`) Echo.private(`App.Users.Models.User.${getters.user.data.id}`)
.listen('.Domain\\Notifications\\Events\\TestUpdate', (e) => { .notification(() => {
console.log(e); // TODO: call sound
}); dispatch('getAppData')
});
}, },
} }

View File

@@ -18,6 +18,7 @@ const actions = {
resolve(response) resolve(response)
commit('RETRIEVE_USER', response.data) commit('RETRIEVE_USER', response.data)
commit('UPDATE_NOTIFICATION_COUNT', response.data.data.relationships.unreadNotifications.data.length)
if (! getters.isRunningConnection) { if (! getters.isRunningConnection) {
dispatch('runConnection') dispatch('runConnection')
@@ -172,6 +173,13 @@ const mutations = {
} }
}) })
}, },
PUSH_NEW_NOTIFICATION(state, notification) {
state.user.data.relationships.unreadNotifications.data.push(notification)
},
FLUSH_NOTIFICATIONS(state) {
state.user.data.relationships.readNotifications.data = []
state.user.data.relationships.unreadNotifications.data = []
},
} }
const getters = { const getters = {

View File

@@ -11,8 +11,4 @@
| |
*/ */
//Broadcast::channel('App.User.{id}', fn ($user, $id) => (int) $user->id === (int) $id); Broadcast::channel('App.Users.Models.User.{id}', fn ($user, $id) => $user->id === $id);
Broadcast::channel('test.{id}', function ($user, $id) {
return true;
});

View File

@@ -4,6 +4,9 @@ use App\Users\Controllers\Account\AccountDetailsController;
use App\Users\Controllers\Account\UpdatePasswordController; use App\Users\Controllers\Account\UpdatePasswordController;
use App\Users\Controllers\Account\StorageCapacityController; use App\Users\Controllers\Account\StorageCapacityController;
use App\Users\Controllers\Verification\VerifyEmailController; use App\Users\Controllers\Verification\VerifyEmailController;
use Domain\Notifications\Controllers\FlushUserNotificationsController;
use Domain\Notifications\Controllers\GetUserNotificationsController;
use Domain\Notifications\Controllers\MarkUserNotificationsAsReadController;
use Domain\Transactions\Controllers\GetTransactionsController; use Domain\Transactions\Controllers\GetTransactionsController;
use App\Users\Controllers\Verification\ResendVerificationEmail; use App\Users\Controllers\Verification\ResendVerificationEmail;
use App\Users\Controllers\Authentication\CheckAccountController; use App\Users\Controllers\Authentication\CheckAccountController;
@@ -22,7 +25,12 @@ Route::post('/email/verify/resend', ResendVerificationEmail::class)
Route::group(['middleware' => ['auth:sanctum']], function () { Route::group(['middleware' => ['auth:sanctum']], function () {
// User Access Token // User Access Token
Route::apiResource('/tokens', AccountAccessTokenController::class); Route::apiResource('/tokens', AccountAccessTokenController::class);
// Notifications
Route::post('/notifications/read', MarkUserNotificationsAsReadController::class);
Route::delete('/notifications', FlushUserNotificationsController::class);
Route::get('/notifications', GetUserNotificationsController::class);
// Account // Account
Route::patch('/settings', UpdateProfileSettingsController::class); Route::patch('/settings', UpdateProfileSettingsController::class);
Route::get('/transactions', GetTransactionsController::class); Route::get('/transactions', GetTransactionsController::class);

View File

@@ -2,6 +2,7 @@
namespace App\Users\Resources; namespace App\Users\Resources;
use Domain\Notifications\Resources\NotificationCollection;
use Domain\Folders\Resources\FolderCollection; use Domain\Folders\Resources\FolderCollection;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
use App\Users\Actions\FormatUsageEstimatesAction; use App\Users\Actions\FormatUsageEstimatesAction;
@@ -43,9 +44,11 @@ class UserResource extends JsonResource
'updated_at' => format_date($this->updated_at, 'd. M. Y'), 'updated_at' => format_date($this->updated_at, 'd. M. Y'),
], ],
'relationships' => [ 'relationships' => [
'settings' => new SettingsResource($this->settings), 'readNotifications' => new NotificationCollection($this->readNotifications),
'favourites' => new FolderCollection($this->favouriteFolders), 'unreadNotifications' => new NotificationCollection($this->unreadNotifications),
'creditCards' => new CreditCardCollection($this->creditCards), 'settings' => new SettingsResource($this->settings),
'favourites' => new FolderCollection($this->favouriteFolders),
'creditCards' => new CreditCardCollection($this->creditCards),
$this->mergeWhen($this->hasSubscription(), fn() => [ $this->mergeWhen($this->hasSubscription(), fn() => [
'subscription' => new SubscriptionResource($this->subscription), 'subscription' => new SubscriptionResource($this->subscription),
]), ]),

View File

@@ -0,0 +1,23 @@
<?php
namespace Domain\Notifications\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
class FlushUserNotificationsController extends Controller
{
public function __invoke(): Response|Application|ResponseFactory
{
if (is_demo_account()) {
return response('Done', 204);
}
// Delete all notifications
auth()->user()->notifications()->delete();
return response('Done', 204);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Domain\Notifications\Controllers;
use App\Http\Controllers\Controller;
use Domain\Notifications\Resources\NotificationCollection;
class GetUserNotificationsController extends Controller
{
public function __invoke(): NotificationCollection
{
return new NotificationCollection(
auth()->user()->notifications
);
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace Domain\Notifications\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
class MarkUserNotificationsAsReadController extends Controller
{
public function __invoke(): Response|Application|ResponseFactory
{
if (is_demo_account()) {
return response('Done', 204);
}
// Mark all notifications as read
auth()->user()->unreadNotifications()->update(['read_at' => now()]);
return response('Done', 204);
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Domain\Notifications\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class NotificationCollection extends ResourceCollection
{
public $collects = NotificationResource::class;
public function toArray($request): array
{
return [
'data' => $this->collection,
];
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Domain\Notifications\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class NotificationResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => $this->id,
'type' => $this->type,
'attributes' => [
'type' => $this->data['type'],
'title' => $this->data['title'],
'description' => $this->data['description'],
'action' => $this->data['action'] ?? null,
'created_at' => format_date($this->created_at, 'd. M. Y h:i'),
'read_at' => $this->read_at ? format_date($this->read_at, 'd. M. Y h:i') : null,
],
],
];
}
}

View File

@@ -23,22 +23,16 @@ class UploadRequestFulfilledNotification extends Notification implements ShouldQ
/** /**
* Get the notification's delivery channels. * Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/ */
public function via($notifiable) public function via(mixed $notifiable): array
{ {
return ['mail', 'database']; return ['mail', 'database', 'broadcast'];
} }
/** /**
* Get the mail representation of the notification. * Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/ */
public function toMail($notifiable) public function toMail(mixed $notifiable): MailMessage
{ {
// TODO: add to language strings // TODO: add to language strings
return (new MailMessage) return (new MailMessage)
@@ -59,7 +53,12 @@ class UploadRequestFulfilledNotification extends Notification implements ShouldQ
'title' => 'File Request Filled', 'title' => 'File Request Filled',
'description' => "Your file request for '{$this->uploadRequest->parent->name}' folder was filled successfully.", 'description' => "Your file request for '{$this->uploadRequest->parent->name}' folder was filled successfully.",
'action' => [ 'action' => [
'id' => $this->uploadRequest->id, 'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => $this->uploadRequest->id,
],
], ],
]; ];
} }

View File

@@ -0,0 +1,134 @@
<?php
namespace Tests\Domain\Notifications;
use App\Users\Models\User;
use Tests\TestCase;
use Str;
use DB;
class NotificationsTest extends TestCase
{
/**
* @test
*/
public function it_get_all_notifications()
{
$user = User::factory()
->hasSettings()
->create();
DB::table('notifications')
->insert([
'id' => Str::uuid(),
'type' => 'Domain\UploadRequest\Notifications\UploadRequestFulfilledNotification',
'notifiable_type' => 'App\Users\Models\User',
'notifiable_id' => $user->id,
'data' => json_encode([
'type' => 'file-request',
'title' => 'File Request Filled',
'description' => "Your file request for 'Documents' folder was filled successfully.",
'action' => [
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => Str::uuid(),
],
],
]),
'created_at' => now(),
'updated_at' => now(),
]);
$this
->actingAs($user)
->getJson('/api/user/notifications')
->assertJsonFragment([
'type' => 'file-request',
])
->assertStatus(200);
}
/**
* @test
*/
public function it_mark_as_read_notifications()
{
$user = User::factory()
->hasSettings()
->create();
DB::table('notifications')
->insert([
'id' => Str::uuid(),
'type' => 'Domain\UploadRequest\Notifications\UploadRequestFulfilledNotification',
'notifiable_type' => 'App\Users\Models\User',
'notifiable_id' => $user->id,
'data' => json_encode([
'type' => 'file-request',
'title' => 'File Request Filled',
'description' => "Your file request for 'Documents' folder was filled successfully.",
'action' => [
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => Str::uuid(),
],
],
]),
'created_at' => now(),
'updated_at' => now(),
]);
$this
->actingAs($user)
->postJson('/api/user/notifications/read')
->assertStatus(204);
$this->assertDatabaseHas('notifications', [
'read_at' => now(),
]);
}
/**
* @test
*/
public function it_delete_all_notifications()
{
$user = User::factory()
->hasSettings()
->create();
DB::table('notifications')
->insert([
'id' => Str::uuid(),
'type' => 'Domain\UploadRequest\Notifications\UploadRequestFulfilledNotification',
'notifiable_type' => 'App\Users\Models\User',
'notifiable_id' => $user->id,
'data' => json_encode([
'type' => 'file-request',
'title' => 'File Request Filled',
'description' => "Your file request for 'Documents' folder was filled successfully.",
'action' => [
'type' => 'route',
'params' => [
'route' => 'Files',
'button' => 'Show Files',
'id' => Str::uuid(),
],
],
]),
'created_at' => now(),
'updated_at' => now(),
]);
$this
->actingAs($user)
->deleteJson('/api/user/notifications')
->assertStatus(204);
$this->assertDatabaseCount('notifications', 0);
}
}