diff --git a/backend/composer.json b/backend/composer.json
index dbc27a1..22fb6bb 100644
--- a/backend/composer.json
+++ b/backend/composer.json
@@ -11,6 +11,7 @@
"license": "MIT",
"require": {
"php": "^8.2",
+ "knuckleswtf/scribe": "^4.38",
"laravel/framework": "^11.9",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.9"
diff --git a/backend/composer.lock b/backend/composer.lock
index 09b12b7..97533e5 100644
--- a/backend/composer.lock
+++ b/backend/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": "2ccadfe61f1bf0098718e1b614c30025",
+ "content-hash": "b9c7d71f3fa6faefde7ac15e344897c3",
"packages": [
{
"name": "brick/math",
@@ -506,6 +506,190 @@
],
"time": "2023-10-06T06:47:41+00:00"
},
+ {
+ "name": "erusev/parsedown",
+ "version": "1.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/erusev/parsedown.git",
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Parsedown": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Emanuil Rusev",
+ "email": "hello@erusev.com",
+ "homepage": "http://erusev.com"
+ }
+ ],
+ "description": "Parser for Markdown.",
+ "homepage": "http://parsedown.org",
+ "keywords": [
+ "markdown",
+ "parser"
+ ],
+ "support": {
+ "issues": "https://github.com/erusev/parsedown/issues",
+ "source": "https://github.com/erusev/parsedown/tree/1.7.x"
+ },
+ "time": "2019-12-30T22:54:17+00:00"
+ },
+ {
+ "name": "fakerphp/faker",
+ "version": "v1.23.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b",
+ "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "psr/container": "^1.0 || ^2.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "conflict": {
+ "fzaninotto/faker": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "doctrine/persistence": "^1.3 || ^2.0",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
+ },
+ "suggest": {
+ "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+ "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+ "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+ "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+ "ext-mbstring": "Required for multibyte Unicode string functionality."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "support": {
+ "issues": "https://github.com/FakerPHP/Faker/issues",
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1"
+ },
+ "time": "2024-01-02T13:46:09+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.15.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
+ "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.15.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-03T12:00:00+00:00"
+ },
{
"name": "fruitcake/php-cors",
"version": "v1.3.0",
@@ -1050,6 +1234,101 @@
],
"time": "2023-12-03T19:50:20+00:00"
},
+ {
+ "name": "knuckleswtf/scribe",
+ "version": "4.38.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/knuckleswtf/scribe.git",
+ "reference": "da667aafb6804b4b599ac6506bb178bfa5434802"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/knuckleswtf/scribe/zipball/da667aafb6804b4b599ac6506bb178bfa5434802",
+ "reference": "da667aafb6804b4b599ac6506bb178bfa5434802",
+ "shasum": ""
+ },
+ "require": {
+ "erusev/parsedown": "1.7.4",
+ "ext-fileinfo": "*",
+ "ext-json": "*",
+ "ext-pdo": "*",
+ "fakerphp/faker": "^1.9.1",
+ "illuminate/console": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/routing": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^8.0|^9.0|^10.0|^11.0",
+ "league/flysystem": "^1.1.4|^2.1.1|^3.0",
+ "mpociot/reflection-docblock": "^1.0.1",
+ "nikic/php-parser": "^5.0",
+ "nunomaduro/collision": "^5.10|^6.0|^7.0|^8.0",
+ "php": ">=8.0",
+ "ramsey/uuid": "^4.2.2",
+ "shalvah/clara": "^3.1.0",
+ "shalvah/upgrader": ">=0.6.0",
+ "spatie/data-transfer-object": "^2.6|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "replace": {
+ "mpociot/laravel-apidoc-generator": "*"
+ },
+ "require-dev": {
+ "brianium/paratest": "^6.0",
+ "dms/phpunit-arraysubset-asserts": "^0.4",
+ "laravel/legacy-factories": "^1.3.0",
+ "laravel/lumen-framework": "^8.0|^9.0|^10.0",
+ "league/fractal": "^0.20",
+ "nikic/fast-route": "^1.3",
+ "orchestra/testbench": "^6.0|^7.0|^8.0",
+ "pestphp/pest": "^1.21",
+ "phpstan/phpstan": "^1.0",
+ "phpunit/phpunit": "^9.0|^10.0",
+ "symfony/css-selector": "^5.4|^6.0",
+ "symfony/dom-crawler": "^5.4|^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Knuckles\\Scribe\\ScribeServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Knuckles\\Camel\\": "camel/",
+ "Knuckles\\Scribe\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Shalvah"
+ }
+ ],
+ "description": "Generate API documentation for humans from your Laravel codebase.✍",
+ "homepage": "http://github.com/knuckleswtf/scribe",
+ "keywords": [
+ "api",
+ "dingo",
+ "documentation",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/knuckleswtf/scribe/issues",
+ "source": "https://github.com/knuckleswtf/scribe/tree/4.38.0"
+ },
+ "funding": [
+ {
+ "url": "https://patreon.com/shalvah",
+ "type": "patreon"
+ }
+ ],
+ "time": "2024-10-18T20:16:40+00:00"
+ },
{
"name": "laravel/framework",
"version": "v11.21.0",
@@ -1982,6 +2261,59 @@
],
"time": "2024-06-28T09:40:51+00:00"
},
+ {
+ "name": "mpociot/reflection-docblock",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mpociot/reflection-docblock.git",
+ "reference": "c8b2e2b1f5cebbb06e2b5ccbf2958f2198867587"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mpociot/reflection-docblock/zipball/c8b2e2b1f5cebbb06e2b5ccbf2958f2198867587",
+ "reference": "c8b2e2b1f5cebbb06e2b5ccbf2958f2198867587",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "dflydev/markdown": "~1.0",
+ "erusev/parsedown": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Mpociot": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ],
+ "support": {
+ "issues": "https://github.com/mpociot/reflection-docblock/issues",
+ "source": "https://github.com/mpociot/reflection-docblock/tree/master"
+ },
+ "time": "2016-06-20T20:53:12+00:00"
+ },
{
"name": "nesbot/carbon",
"version": "3.8.0",
@@ -2294,6 +2626,103 @@
},
"time": "2024-07-01T20:03:41+00:00"
},
+ {
+ "name": "nunomaduro/collision",
+ "version": "v8.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a",
+ "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a",
+ "shasum": ""
+ },
+ "require": {
+ "filp/whoops": "^2.15.4",
+ "nunomaduro/termwind": "^2.0.1",
+ "php": "^8.2.0",
+ "symfony/console": "^7.1.3"
+ },
+ "conflict": {
+ "laravel/framework": "<11.0.0 || >=12.0.0",
+ "phpunit/phpunit": "<10.5.1 || >=12.0.0"
+ },
+ "require-dev": {
+ "larastan/larastan": "^2.9.8",
+ "laravel/framework": "^11.19.0",
+ "laravel/pint": "^1.17.1",
+ "laravel/sail": "^1.31.0",
+ "laravel/sanctum": "^4.0.2",
+ "laravel/tinker": "^2.9.0",
+ "orchestra/testbench-core": "^9.2.3",
+ "pestphp/pest": "^2.35.0 || ^3.0.0",
+ "sebastian/environment": "^6.1.0 || ^7.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-8.x": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "./src/Adapters/Phpunit/Autoload.php"
+ ],
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/collision/issues",
+ "source": "https://github.com/nunomaduro/collision"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2024-08-03T15:32:23+00:00"
+ },
{
"name": "nunomaduro/termwind",
"version": "v2.0.1",
@@ -3173,6 +3602,175 @@
],
"time": "2024-04-27T21:32:50+00:00"
},
+ {
+ "name": "shalvah/clara",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/shalvah/clara.git",
+ "reference": "cdbb5737cbdd101756d97dd2279a979a1af7710b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/shalvah/clara/zipball/cdbb5737cbdd101756d97dd2279a979a1af7710b",
+ "reference": "cdbb5737cbdd101756d97dd2279a979a1af7710b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4",
+ "symfony/console": "^4.0|^5.0|^6.0|^7.0"
+ },
+ "require-dev": {
+ "eloquent/phony-phpunit": "^7.0",
+ "phpunit/phpunit": "^9.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Shalvah\\Clara\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "🔊 Simple, pretty, testable console output for CLI apps.",
+ "keywords": [
+ "cli",
+ "log",
+ "logging"
+ ],
+ "support": {
+ "issues": "https://github.com/shalvah/clara/issues",
+ "source": "https://github.com/shalvah/clara/tree/3.2.0"
+ },
+ "time": "2024-02-27T20:30:59+00:00"
+ },
+ {
+ "name": "shalvah/upgrader",
+ "version": "0.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/shalvah/upgrader.git",
+ "reference": "d95ed17fe9f5e1ee7d47ad835595f1af080a867f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/shalvah/upgrader/zipball/d95ed17fe9f5e1ee7d47ad835595f1af080a867f",
+ "reference": "d95ed17fe9f5e1ee7d47ad835595f1af080a867f",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/support": ">=8.0",
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.0"
+ },
+ "require-dev": {
+ "dms/phpunit-arraysubset-asserts": "^0.2.0",
+ "pestphp/pest": "^1.21",
+ "phpstan/phpstan": "^1.0",
+ "spatie/ray": "^1.33"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Shalvah\\Upgrader\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Shalvah",
+ "email": "hello@shalvah.me"
+ }
+ ],
+ "description": "Create automatic upgrades for your package.",
+ "homepage": "http://github.com/shalvah/upgrader",
+ "keywords": [
+ "upgrade"
+ ],
+ "support": {
+ "issues": "https://github.com/shalvah/upgrader/issues",
+ "source": "https://github.com/shalvah/upgrader/tree/0.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://patreon.com/shalvah",
+ "type": "patreon"
+ }
+ ],
+ "time": "2024-02-20T11:51:46+00:00"
+ },
+ {
+ "name": "spatie/data-transfer-object",
+ "version": "3.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/data-transfer-object.git",
+ "reference": "1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8",
+ "reference": "1df0906c4e9e3aebd6c0506fd82c8b7d5548c1c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "illuminate/collections": "^8.36",
+ "jetbrains/phpstorm-attributes": "^1.0",
+ "larapack/dd": "^1.1",
+ "phpunit/phpunit": "^9.5.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\DataTransferObject\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brent Roose",
+ "email": "brent@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Data transfer objects with batteries included",
+ "homepage": "https://github.com/spatie/data-transfer-object",
+ "keywords": [
+ "data-transfer-object",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/data-transfer-object/issues",
+ "source": "https://github.com/spatie/data-transfer-object/tree/3.9.1"
+ },
+ "funding": [
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "abandoned": "spatie/laravel-data",
+ "time": "2022-09-16T13:34:38+00:00"
+ },
{
"name": "symfony/clock",
"version": "v7.1.1",
@@ -5473,6 +6071,153 @@
],
"time": "2024-07-26T12:41:01+00:00"
},
+ {
+ "name": "symfony/var-exporter",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1a6a89f95a46af0f142874c9d650a6358d13070d",
+ "reference": "1a6a89f95a46af0f142874c9d650a6358d13070d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\VarExporter\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "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": "Allows exporting any serializable PHP data structure to plain PHP code",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clone",
+ "construct",
+ "export",
+ "hydrate",
+ "instantiate",
+ "lazy-loading",
+ "proxy",
+ "serialize"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-exporter/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-18T07:58:17+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v7.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "fa34c77015aa6720469db7003567b9f772492bf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2",
+ "reference": "fa34c77015aa6720469db7003567b9f772492bf2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "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": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v7.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-31T14:57:53+00:00"
+ },
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "v2.2.7",
@@ -5744,140 +6489,6 @@
}
],
"packages-dev": [
- {
- "name": "fakerphp/faker",
- "version": "v1.23.1",
- "source": {
- "type": "git",
- "url": "https://github.com/FakerPHP/Faker.git",
- "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b",
- "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b",
- "shasum": ""
- },
- "require": {
- "php": "^7.4 || ^8.0",
- "psr/container": "^1.0 || ^2.0",
- "symfony/deprecation-contracts": "^2.2 || ^3.0"
- },
- "conflict": {
- "fzaninotto/faker": "*"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
- "doctrine/persistence": "^1.3 || ^2.0",
- "ext-intl": "*",
- "phpunit/phpunit": "^9.5.26",
- "symfony/phpunit-bridge": "^5.4.16"
- },
- "suggest": {
- "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
- "ext-curl": "Required by Faker\\Provider\\Image to download images.",
- "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
- "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
- "ext-mbstring": "Required for multibyte Unicode string functionality."
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Faker\\": "src/Faker/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "François Zaninotto"
- }
- ],
- "description": "Faker is a PHP library that generates fake data for you.",
- "keywords": [
- "data",
- "faker",
- "fixtures"
- ],
- "support": {
- "issues": "https://github.com/FakerPHP/Faker/issues",
- "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1"
- },
- "time": "2024-01-02T13:46:09+00:00"
- },
- {
- "name": "filp/whoops",
- "version": "2.15.4",
- "source": {
- "type": "git",
- "url": "https://github.com/filp/whoops.git",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
- "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9 || ^7.0 || ^8.0",
- "psr/log": "^1.0.1 || ^2.0 || ^3.0"
- },
- "require-dev": {
- "mockery/mockery": "^0.9 || ^1.0",
- "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
- "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
- },
- "suggest": {
- "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
- "whoops/soap": "Formats errors as SOAP responses"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.7-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Whoops\\": "src/Whoops/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Filipe Dobreira",
- "homepage": "https://github.com/filp",
- "role": "Developer"
- }
- ],
- "description": "php error handling for cool kids",
- "homepage": "https://filp.github.io/whoops/",
- "keywords": [
- "error",
- "exception",
- "handling",
- "library",
- "throwable",
- "whoops"
- ],
- "support": {
- "issues": "https://github.com/filp/whoops/issues",
- "source": "https://github.com/filp/whoops/tree/2.15.4"
- },
- "funding": [
- {
- "url": "https://github.com/denis-sokolov",
- "type": "github"
- }
- ],
- "time": "2023-11-03T12:00:00+00:00"
- },
{
"name": "hamcrest/hamcrest-php",
"version": "v2.0.1",
@@ -6201,103 +6812,6 @@
],
"time": "2024-06-12T14:39:25+00:00"
},
- {
- "name": "nunomaduro/collision",
- "version": "v8.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/nunomaduro/collision.git",
- "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a",
- "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a",
- "shasum": ""
- },
- "require": {
- "filp/whoops": "^2.15.4",
- "nunomaduro/termwind": "^2.0.1",
- "php": "^8.2.0",
- "symfony/console": "^7.1.3"
- },
- "conflict": {
- "laravel/framework": "<11.0.0 || >=12.0.0",
- "phpunit/phpunit": "<10.5.1 || >=12.0.0"
- },
- "require-dev": {
- "larastan/larastan": "^2.9.8",
- "laravel/framework": "^11.19.0",
- "laravel/pint": "^1.17.1",
- "laravel/sail": "^1.31.0",
- "laravel/sanctum": "^4.0.2",
- "laravel/tinker": "^2.9.0",
- "orchestra/testbench-core": "^9.2.3",
- "pestphp/pest": "^2.35.0 || ^3.0.0",
- "sebastian/environment": "^6.1.0 || ^7.0.0"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
- ]
- },
- "branch-alias": {
- "dev-8.x": "8.x-dev"
- }
- },
- "autoload": {
- "files": [
- "./src/Adapters/Phpunit/Autoload.php"
- ],
- "psr-4": {
- "NunoMaduro\\Collision\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nuno Maduro",
- "email": "enunomaduro@gmail.com"
- }
- ],
- "description": "Cli error handling for console/command-line PHP applications.",
- "keywords": [
- "artisan",
- "cli",
- "command-line",
- "console",
- "error",
- "handling",
- "laravel",
- "laravel-zero",
- "php",
- "symfony"
- ],
- "support": {
- "issues": "https://github.com/nunomaduro/collision/issues",
- "source": "https://github.com/nunomaduro/collision"
- },
- "funding": [
- {
- "url": "https://www.paypal.com/paypalme/enunomaduro",
- "type": "custom"
- },
- {
- "url": "https://github.com/nunomaduro",
- "type": "github"
- },
- {
- "url": "https://www.patreon.com/nunomaduro",
- "type": "patreon"
- }
- ],
- "time": "2024-08-03T15:32:23+00:00"
- },
{
"name": "phar-io/manifest",
"version": "2.0.4",
@@ -7762,77 +8276,6 @@
],
"time": "2024-07-03T05:13:08+00:00"
},
- {
- "name": "symfony/yaml",
- "version": "v7.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "fa34c77015aa6720469db7003567b9f772492bf2"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2",
- "reference": "fa34c77015aa6720469db7003567b9f772492bf2",
- "shasum": ""
- },
- "require": {
- "php": ">=8.2",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "symfony/console": "<6.4"
- },
- "require-dev": {
- "symfony/console": "^6.4|^7.0"
- },
- "bin": [
- "Resources/bin/yaml-lint"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Yaml\\": ""
- },
- "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": "Loads and dumps YAML files",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/yaml/tree/v7.1.1"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2024-05-31T14:57:53+00:00"
- },
{
"name": "theseer/tokenizer",
"version": "1.2.3",
diff --git a/backend/config/scribe.php b/backend/config/scribe.php
new file mode 100644
index 0000000..217b2d4
--- /dev/null
+++ b/backend/config/scribe.php
@@ -0,0 +1,272 @@
+ for the generated documentation. If this is empty, Scribe will infer it from config('app.name').
+ 'title' => null,
+
+ // A short description of your API. Will be included in the docs webpage, Postman collection and OpenAPI spec.
+ 'description' => '',
+
+ // The base URL displayed in the docs. If this is empty, Scribe will use the value of config('app.url') at generation time.
+ // If you're using `laravel` type, you can set this to a dynamic string, like '{{ config("app.tenant_url") }}' to get a dynamic base URL.
+ 'base_url' => null,
+
+ 'routes' => [
+ [
+ // Routes that match these conditions will be included in the docs
+ 'match' => [
+ // Match only routes whose paths match this pattern (use * as a wildcard to match any characters). Example: 'users/*'.
+ 'prefixes' => ['api/*'],
+
+ // Match only routes whose domains match this pattern (use * as a wildcard to match any characters). Example: 'api.*'.
+ 'domains' => ['*'],
+
+ // [Dingo router only] Match only routes registered under this version. Wildcards are NOT supported.
+ 'versions' => ['v1'],
+ ],
+
+ // Include these routes even if they did not match the rules above.
+ 'include' => [
+ // 'users.index', 'POST /new', '/auth/*'
+ ],
+
+ // Exclude these routes even if they matched the rules above.
+ 'exclude' => [
+ // 'GET /health', 'admin.*'
+ ],
+ ],
+ ],
+
+ // The type of documentation output to generate.
+ // - "static" will generate a static HTMl page in the /public/docs folder,
+ // - "laravel" will generate the documentation as a Blade view, so you can add routing and authentication.
+ // - "external_static" and "external_laravel" do the same as above, but generate a basic template,
+ // passing the OpenAPI spec as a URL, allowing you to easily use the docs with an external generator
+ 'type' => 'swagger',
+
+ 'path' => 'public/docs', // Pfad für die Dokumentation
+
+ // See https://scribe.knuckles.wtf/laravel/reference/config#theme for supported options
+ 'theme' => 'default',
+
+ 'static' => [
+ // HTML documentation, assets and Postman collection will be generated to this folder.
+ // Source Markdown will still be in resources/docs.
+ 'output_path' => 'public/docs',
+ ],
+
+ 'laravel' => [
+ // Whether to automatically create a docs endpoint for you to view your generated docs.
+ // If this is false, you can still set up routing manually.
+ 'add_routes' => true,
+
+ // URL path to use for the docs endpoint (if `add_routes` is true).
+ // By default, `/docs` opens the HTML page, `/docs.postman` opens the Postman collection, and `/docs.openapi` the OpenAPI spec.
+ 'docs_url' => '/docs',
+
+ // Directory within `public` in which to store CSS and JS assets.
+ // By default, assets are stored in `public/vendor/scribe`.
+ // If set, assets will be stored in `public/{{assets_directory}}`
+ 'assets_directory' => null,
+
+ // Middleware to attach to the docs endpoint (if `add_routes` is true).
+ 'middleware' => [],
+ ],
+
+ 'external' => [
+ 'html_attributes' => []
+ ],
+
+ 'try_it_out' => [
+ // Add a Try It Out button to your endpoints so consumers can test endpoints right from their browser.
+ // Don't forget to enable CORS headers for your endpoints.
+ 'enabled' => true,
+
+ // The base URL for the API tester to use (for example, you can set this to your staging URL).
+ // Leave as null to use the current app URL when generating (config("app.url")).
+ 'base_url' => null,
+
+ // [Laravel Sanctum] Fetch a CSRF token before each request, and add it as an X-XSRF-TOKEN header.
+ 'use_csrf' => false,
+
+ // The URL to fetch the CSRF token from (if `use_csrf` is true).
+ 'csrf_url' => '/sanctum/csrf-cookie',
+ ],
+
+ // How is your API authenticated? This information will be used in the displayed docs, generated examples and response calls.
+ 'auth' => [
+ // Set this to true if ANY endpoints in your API use authentication.
+ 'enabled' => false,
+
+ // Set this to true if your API should be authenticated by default. If so, you must also set `enabled` (above) to true.
+ // You can then use @unauthenticated or @authenticated on individual endpoints to change their status from the default.
+ 'default' => false,
+
+ // Where is the auth value meant to be sent in a request?
+ // Options: query, body, basic, bearer, header (for custom header)
+ 'in' => 'bearer',
+
+ // The name of the auth parameter (eg token, key, apiKey) or header (eg Authorization, Api-Key).
+ 'name' => 'key',
+
+ // The value of the parameter to be used by Scribe to authenticate response calls.
+ // This will NOT be included in the generated documentation. If empty, Scribe will use a random value.
+ 'use_value' => env('SCRIBE_AUTH_KEY'),
+
+ // Placeholder your users will see for the auth parameter in the example requests.
+ // Set this to null if you want Scribe to use a random value as placeholder instead.
+ 'placeholder' => '{YOUR_AUTH_KEY}',
+
+ // Any extra authentication-related info for your users. Markdown and HTML are supported.
+ 'extra_info' => 'You can retrieve your token by visiting your dashboard and clicking Generate API token.',
+ ],
+
+ // Text to place in the "Introduction" section, right after the `description`. Markdown and HTML are supported.
+ 'intro_text' => <<As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
+You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).
+INTRO
+ ,
+
+ // Example requests for each endpoint will be shown in each of these languages.
+ // Supported options are: bash, javascript, php, python
+ // To add a language of your own, see https://scribe.knuckles.wtf/laravel/advanced/example-requests
+ 'example_languages' => [
+ 'bash',
+ 'javascript',
+ ],
+
+ // Generate a Postman collection (v2.1.0) in addition to HTML docs.
+ // For 'static' docs, the collection will be generated to public/docs/collection.json.
+ // For 'laravel' docs, it will be generated to storage/app/scribe/collection.json.
+ // Setting `laravel.add_routes` to true (above) will also add a route for the collection.
+ 'postman' => [
+ 'enabled' => true,
+
+ 'overrides' => [
+ // 'info.version' => '2.0.0',
+ ],
+ ],
+
+ // Generate an OpenAPI spec (v3.0.1) in addition to docs webpage.
+ // For 'static' docs, the collection will be generated to public/docs/openapi.yaml.
+ // For 'laravel' docs, it will be generated to storage/app/scribe/openapi.yaml.
+ // Setting `laravel.add_routes` to true (above) will also add a route for the spec.
+ 'openapi' => [
+ 'enabled' => true,
+
+ 'overrides' => [
+ // 'info.version' => '2.0.0',
+ ],
+ ],
+
+ 'groups' => [
+ // Endpoints which don't have a @group will be placed in this default group.
+ 'default' => 'Endpoints',
+
+ // By default, Scribe will sort groups alphabetically, and endpoints in the order their routes are defined.
+ // You can override this by listing the groups, subgroups and endpoints here in the order you want them.
+ // See https://scribe.knuckles.wtf/blog/laravel-v4#easier-sorting and https://scribe.knuckles.wtf/laravel/reference/config#order for details
+ 'order' => [],
+ ],
+
+ // Custom logo path. This will be used as the value of the src attribute for the
tag,
+ // so make sure it points to an accessible URL or path. Set to false to not use a logo.
+ // For example, if your logo is in public/img:
+ // - 'logo' => '../img/logo.png' // for `static` type (output folder is public/docs)
+ // - 'logo' => 'img/logo.png' // for `laravel` type
+ 'logo' => false,
+
+ // Customize the "Last updated" value displayed in the docs by specifying tokens and formats.
+ // Examples:
+ // - {date:F j Y} => March 28, 2022
+ // - {git:short} => Short hash of the last Git commit
+ // Available tokens are `{date:}` and `{git:}`.
+ // The format you pass to `date` will be passed to PHP's `date()` function.
+ // The format you pass to `git` can be either "short" or "long".
+ 'last_updated' => 'Last updated: {date:F j, Y}',
+
+ 'examples' => [
+ // Set this to any number (eg. 1234) to generate the same example values for parameters on each run,
+ 'faker_seed' => null,
+
+ // With API resources and transformers, Scribe tries to generate example models to use in your API responses.
+ // By default, Scribe will try the model's factory, and if that fails, try fetching the first from the database.
+ // You can reorder or remove strategies here.
+ 'models_source' => ['factoryCreate', 'factoryMake', 'databaseFirst'],
+ ],
+
+ // The strategies Scribe will use to extract information about your routes at each stage.
+ // If you create or install a custom strategy, add it here.
+ 'strategies' => [
+ 'metadata' => [
+ Strategies\Metadata\GetFromDocBlocks::class,
+ Strategies\Metadata\GetFromMetadataAttributes::class,
+ ],
+ 'urlParameters' => [
+ Strategies\UrlParameters\GetFromLaravelAPI::class,
+ Strategies\UrlParameters\GetFromUrlParamAttribute::class,
+ Strategies\UrlParameters\GetFromUrlParamTag::class,
+ ],
+ 'queryParameters' => [
+ Strategies\QueryParameters\GetFromFormRequest::class,
+ Strategies\QueryParameters\GetFromInlineValidator::class,
+ Strategies\QueryParameters\GetFromQueryParamAttribute::class,
+ Strategies\QueryParameters\GetFromQueryParamTag::class,
+ ],
+ 'headers' => [
+ Strategies\Headers\GetFromHeaderAttribute::class,
+ Strategies\Headers\GetFromHeaderTag::class,
+ [
+ 'override',
+ [
+ 'Content-Type' => 'application/json',
+ 'Accept' => 'application/json',
+ ]
+ ]
+ ],
+ 'bodyParameters' => [
+ Strategies\BodyParameters\GetFromFormRequest::class,
+ Strategies\BodyParameters\GetFromInlineValidator::class,
+ Strategies\BodyParameters\GetFromBodyParamAttribute::class,
+ Strategies\BodyParameters\GetFromBodyParamTag::class,
+ ],
+ 'responses' => [
+ Strategies\Responses\UseResponseAttributes::class,
+ Strategies\Responses\UseTransformerTags::class,
+ Strategies\Responses\UseApiResourceTags::class,
+ Strategies\Responses\UseResponseTag::class,
+ Strategies\Responses\UseResponseFileTag::class,
+ [
+ Strategies\Responses\ResponseCalls::class,
+ [
+ 'only' => ['GET *'],
+ // Disable debug mode when generating response calls to avoid error stack traces in responses
+ 'config' => [
+ 'app.debug' => false,
+ ],
+ ]
+ ]
+ ],
+ 'responseFields' => [
+ Strategies\ResponseFields\GetFromResponseFieldAttribute::class,
+ Strategies\ResponseFields\GetFromResponseFieldTag::class,
+ ],
+ ],
+
+ // For response calls, API resource responses and transformer responses,
+ // Scribe will try to start database transactions, so no changes are persisted to your database.
+ // Tell Scribe which connections should be transacted here. If you only use one db connection, you can leave this as is.
+ 'database_connections_to_transact' => [config('database.default')],
+
+ 'fractal' => [
+ // If you are using a custom serializer with league/fractal, you can specify it here.
+ 'serializer' => null,
+ ],
+
+ 'routeMatcher' => \Knuckles\Scribe\Matching\RouteMatcher::class,
+];
diff --git a/backend/routes/api.php b/backend/routes/api.php
index 62b94c3..8663d9b 100644
--- a/backend/routes/api.php
+++ b/backend/routes/api.php
@@ -27,4 +27,6 @@ Route::middleware(['auth:sanctum'])->group(function () {
Route::get('/rewards', [RewardController::class, 'index']);
Route::get('/rewards/unlocked', [RewardController::class, 'unlocked']);
+
+ Route::get('/api/documentation', '\Knuckles\Scribe\Http\Controller@documentation');
});