1
0

2 Commity d5ff58e9d4 ... 5c18d25e00

Autor SHA1 Správa Dátum
  olinox14 5c18d25e00 add and complete entities 2 mesiacov pred
  olinox14 2a35b9b696 add easyadminbundle 2 mesiacov pred

+ 38 - 37
api/composer.json

@@ -4,43 +4,44 @@
   "minimum-stability": "stable",
   "prefer-stable": true,
   "require": {
-      "php": ">=8.2",
-      "ext-ctype": "*",
-      "ext-iconv": "*",
-      "api-platform/core": "^4.1",
-      "doctrine/dbal": "^3.9",
-      "doctrine/doctrine-bundle": "^2.13",
-      "doctrine/doctrine-migrations-bundle": "^3.4",
-      "doctrine/orm": "^3.3",
-      "nelmio/cors-bundle": "^2.2",
-      "phpdocumentor/reflection-docblock": "^5.3",
-      "phpstan/phpdoc-parser": "^1.16",
-      "symfony/asset": "7.3.*",
-      "symfony/console": "7.3.*",
-      "symfony/doctrine-messenger": "7.3.*",
-      "symfony/dotenv": "7.3.*",
-      "symfony/error-handler": "7.3.*",
-      "symfony/expression-language": "7.3.*",
-      "symfony/flex": "^1.3.1",
-      "symfony/framework-bundle": "7.3.*",
-      "symfony/http-client": "7.3.*",
-      "symfony/intl": "7.3.*",
-      "symfony/lock": "7.3.*",
-      "symfony/mailer": "7.3.*",
-      "symfony/mercure": "^0.6.1",
-      "symfony/mercure-bundle": "^0.3.4",
-      "symfony/messenger": "7.3.*",
-      "symfony/monolog-bundle": "^3.7",
-      "symfony/property-access": "7.3.*",
-      "symfony/property-info": "7.3.*",
-      "symfony/runtime": "7.3.*",
-      "symfony/security-bundle": "7.3.*",
-      "symfony/serializer": "7.3.*",
-      "symfony/translation": "7.3.*",
-      "symfony/twig-bundle": "7.3.*",
-      "symfony/uid": "7.3.*",
-      "symfony/validator": "7.3.*",
-      "symfony/yaml": "7.3.*"
+    "php": ">=8.2",
+    "ext-ctype": "*",
+    "ext-iconv": "*",
+    "api-platform/core": "^4.1",
+    "doctrine/dbal": "^3.9",
+    "doctrine/doctrine-bundle": "^2.13",
+    "doctrine/doctrine-migrations-bundle": "^3.4",
+    "doctrine/orm": "^3.3",
+    "easycorp/easyadmin-bundle": "^4.26",
+    "nelmio/cors-bundle": "^2.2",
+    "phpdocumentor/reflection-docblock": "^5.3",
+    "phpstan/phpdoc-parser": "^1.16",
+    "symfony/asset": "7.3.*",
+    "symfony/console": "7.3.*",
+    "symfony/doctrine-messenger": "7.3.*",
+    "symfony/dotenv": "7.3.*",
+    "symfony/error-handler": "7.3.*",
+    "symfony/expression-language": "7.3.*",
+    "symfony/flex": "^1.3.1",
+    "symfony/framework-bundle": "7.3.*",
+    "symfony/http-client": "7.3.*",
+    "symfony/intl": "7.3.*",
+    "symfony/lock": "7.3.*",
+    "symfony/mailer": "7.3.*",
+    "symfony/mercure": "^0.6.1",
+    "symfony/mercure-bundle": "^0.3.4",
+    "symfony/messenger": "7.3.*",
+    "symfony/monolog-bundle": "^3.7",
+    "symfony/property-access": "7.3.*",
+    "symfony/property-info": "7.3.*",
+    "symfony/runtime": "7.3.*",
+    "symfony/security-bundle": "7.3.*",
+    "symfony/serializer": "7.3.*",
+    "symfony/translation": "7.3.*",
+    "symfony/twig-bundle": "7.3.*",
+    "symfony/uid": "7.3.*",
+    "symfony/validator": "7.3.*",
+    "symfony/yaml": "7.3.*"
   },
   "require-dev": {
     "phpstan/extension-installer": "^1.2",

+ 592 - 1
api/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": "a57ad2e1fd06a215a51641d1016724cf",
+    "content-hash": "176e8b4591addb6b9e150abad66baf88",
     "packages": [
         {
             "name": "api-platform/core",
@@ -1350,6 +1350,108 @@
             },
             "time": "2025-01-24T11:45:48+00:00"
         },
+        {
+            "name": "easycorp/easyadmin-bundle",
+            "version": "v4.26.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/EasyCorp/EasyAdminBundle.git",
+                "reference": "fed89754c7532ce5592fda43921d810b59e24c4c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/fed89754c7532ce5592fda43921d810b59e24c4c",
+                "reference": "fed89754c7532ce5592fda43921d810b59e24c4c",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/doctrine-bundle": "^2.5",
+                "doctrine/orm": "^2.12|^3.0",
+                "ext-json": "*",
+                "php": ">=8.1",
+                "symfony/asset": "^5.4|^6.0|^7.0",
+                "symfony/cache": "^5.4|^6.0|^7.0",
+                "symfony/config": "^5.4|^6.0|^7.0",
+                "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+                "symfony/deprecation-contracts": "^3.0",
+                "symfony/doctrine-bridge": "^5.4|^6.0|^7.0",
+                "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+                "symfony/filesystem": "^5.4|^6.0|^7.0",
+                "symfony/form": "^5.4|^6.0|^7.0",
+                "symfony/framework-bundle": "^5.4|^6.0|^7.0",
+                "symfony/http-foundation": "^5.4|^6.0|^7.0",
+                "symfony/http-kernel": "^5.4|^6.0|^7.0",
+                "symfony/intl": "^5.4|^6.0|^7.0",
+                "symfony/property-access": "^5.4|^6.0|^7.0",
+                "symfony/security-bundle": "^5.4|^6.0|^7.0",
+                "symfony/string": "^5.4|^6.0|^7.0",
+                "symfony/translation": "^5.4|^6.0|^7.0",
+                "symfony/twig-bridge": "^5.4.48|^6.4.16|^7.1.9",
+                "symfony/twig-bundle": "^5.4|^6.0|^7.0",
+                "symfony/uid": "^5.4|^6.0|^7.0",
+                "symfony/ux-twig-component": "^2.21",
+                "symfony/validator": "^5.4|^6.0|^7.0",
+                "twig/extra-bundle": "^3.17",
+                "twig/html-extra": "^3.17",
+                "twig/twig": "^3.20"
+            },
+            "require-dev": {
+                "doctrine/doctrine-fixtures-bundle": "^3.4|3.5.x-dev",
+                "phpstan/extension-installer": "^1.4",
+                "phpstan/phpstan": "^2.0",
+                "phpstan/phpstan-phpunit": "^2.0",
+                "phpstan/phpstan-strict-rules": "^2.0",
+                "phpstan/phpstan-symfony": "^2.0",
+                "psr/log": "^1.0",
+                "symfony/browser-kit": "^5.4|^6.0|^7.0",
+                "symfony/css-selector": "^5.4|^6.0|^7.0",
+                "symfony/debug-bundle": "^5.4|^6.0|^7.0",
+                "symfony/dom-crawler": "^5.4|^6.0|^7.0",
+                "symfony/expression-language": "^5.4|^6.0|^7.0",
+                "symfony/phpunit-bridge": "^6.1|^7.0",
+                "symfony/process": "^5.4|^6.0|^7.0",
+                "symfony/web-link": "^5.4|^6.0|^7.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "EasyCorp\\Bundle\\EasyAdminBundle\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Project Contributors",
+                    "homepage": "https://github.com/EasyCorp/EasyAdminBundle/graphs/contributors"
+                }
+            ],
+            "description": "Admin generator for Symfony applications",
+            "homepage": "https://github.com/EasyCorp/EasyAdminBundle",
+            "keywords": [
+                "admin",
+                "backend",
+                "generator"
+            ],
+            "support": {
+                "issues": "https://github.com/EasyCorp/EasyAdminBundle/issues",
+                "source": "https://github.com/EasyCorp/EasyAdminBundle/tree/v4.26.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/javiereguiluz",
+                    "type": "github"
+                }
+            ],
+            "time": "2025-10-08T18:21:48+00:00"
+        },
         {
             "name": "egulias/email-validator",
             "version": "4.0.4",
@@ -3614,6 +3716,107 @@
             ],
             "time": "2025-03-03T07:50:24+00:00"
         },
+        {
+            "name": "symfony/form",
+            "version": "v7.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/form.git",
+                "reference": "7b3eee0f4d4dfd1ff1be70a27474197330c61736"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/form/zipball/7b3eee0f4d4dfd1ff1be70a27474197330c61736",
+                "reference": "7b3eee0f4d4dfd1ff1be70a27474197330c61736",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/event-dispatcher": "^6.4|^7.0",
+                "symfony/options-resolver": "^7.3",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-icu": "^1.21",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/property-access": "^6.4|^7.0",
+                "symfony/service-contracts": "^2.5|^3"
+            },
+            "conflict": {
+                "symfony/console": "<6.4",
+                "symfony/dependency-injection": "<6.4",
+                "symfony/doctrine-bridge": "<6.4",
+                "symfony/error-handler": "<6.4",
+                "symfony/framework-bundle": "<6.4",
+                "symfony/http-kernel": "<6.4",
+                "symfony/translation": "<6.4.3|>=7.0,<7.0.3",
+                "symfony/translation-contracts": "<2.5",
+                "symfony/twig-bridge": "<6.4"
+            },
+            "require-dev": {
+                "doctrine/collections": "^1.0|^2.0",
+                "symfony/config": "^6.4|^7.0",
+                "symfony/console": "^6.4|^7.0",
+                "symfony/dependency-injection": "^6.4|^7.0",
+                "symfony/expression-language": "^6.4|^7.0",
+                "symfony/html-sanitizer": "^6.4|^7.0",
+                "symfony/http-foundation": "^6.4|^7.0",
+                "symfony/http-kernel": "^6.4|^7.0",
+                "symfony/intl": "^6.4|^7.0",
+                "symfony/security-core": "^6.4|^7.0",
+                "symfony/security-csrf": "^6.4|^7.0",
+                "symfony/translation": "^6.4.3|^7.0.3",
+                "symfony/uid": "^6.4|^7.0",
+                "symfony/validator": "^6.4|^7.0",
+                "symfony/var-dumper": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Form\\": ""
+                },
+                "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": "Allows to easily create, process and reuse HTML forms",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/form/tree/v7.3.4"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nicolas-grekas",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2025-09-22T15:31:00+00:00"
+        },
         {
             "name": "symfony/framework-bundle",
             "version": "v7.3.4",
@@ -4918,6 +5121,77 @@
             ],
             "time": "2023-11-06T17:08:13+00:00"
         },
+        {
+            "name": "symfony/options-resolver",
+            "version": "v7.3.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/options-resolver.git",
+                "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+                "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\OptionsResolver\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an improved replacement for the array_replace PHP function",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "config",
+                "configuration",
+                "options"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/options-resolver/tree/v7.3.3"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nicolas-grekas",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2025-08-05T10:16:07+00:00"
+        },
         {
             "name": "symfony/password-hasher",
             "version": "v7.3.0",
@@ -5072,6 +5346,94 @@
             ],
             "time": "2025-06-27T09:58:17+00:00"
         },
+        {
+            "name": "symfony/polyfill-intl-icu",
+            "version": "v1.33.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-icu.git",
+                "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c",
+                "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "suggest": {
+                "ext-intl": "For best performance and support of other locales than \"en\""
+            },
+            "type": "library",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/polyfill",
+                    "name": "symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Icu\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ],
+                "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": "Symfony polyfill for intl's ICU-related data and classes",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "icu",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nicolas-grekas",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2025-06-20T22:24:30+00:00"
+        },
         {
             "name": "symfony/polyfill-intl-idn",
             "version": "v1.33.0",
@@ -7149,6 +7511,93 @@
             ],
             "time": "2025-06-27T19:55:54+00:00"
         },
+        {
+            "name": "symfony/ux-twig-component",
+            "version": "v2.30.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/ux-twig-component.git",
+                "reference": "2f445efda4d4400d4d1911ddf9710c366f339614"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/ux-twig-component/zipball/2f445efda4d4400d4d1911ddf9710c366f339614",
+                "reference": "2f445efda4d4400d4d1911ddf9710c366f339614",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/dependency-injection": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/deprecation-contracts": "^2.2|^3.0",
+                "symfony/event-dispatcher": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/property-access": "^5.4|^6.0|^7.0|^8.0",
+                "twig/twig": "^3.10.3"
+            },
+            "conflict": {
+                "symfony/config": "<5.4.0"
+            },
+            "require-dev": {
+                "symfony/console": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/css-selector": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/dom-crawler": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/phpunit-bridge": "^6.0|^7.0|^8.0",
+                "symfony/stimulus-bundle": "^2.9.1",
+                "symfony/twig-bundle": "^5.4|^6.0|^7.0|^8.0",
+                "symfony/webpack-encore-bundle": "^1.15|^2.3.0"
+            },
+            "type": "symfony-bundle",
+            "extra": {
+                "thanks": {
+                    "url": "https://github.com/symfony/ux",
+                    "name": "symfony/ux"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\UX\\TwigComponent\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Twig components for Symfony",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "components",
+                "symfony-ux",
+                "twig"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/ux-twig-component/tree/v2.30.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nicolas-grekas",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2025-08-27T15:25:48+00:00"
+        },
         {
             "name": "symfony/validator",
             "version": "v7.3.4",
@@ -7578,6 +8027,148 @@
             ],
             "time": "2025-08-27T11:34:33+00:00"
         },
+        {
+            "name": "twig/extra-bundle",
+            "version": "v3.21.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/twig-extra-bundle.git",
+                "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/62d1cf47a1aa009cbd07b21045b97d3d5cb79896",
+                "reference": "62d1cf47a1aa009cbd07b21045b97d3d5cb79896",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1.0",
+                "symfony/framework-bundle": "^5.4|^6.4|^7.0",
+                "symfony/twig-bundle": "^5.4|^6.4|^7.0",
+                "twig/twig": "^3.2|^4.0"
+            },
+            "require-dev": {
+                "league/commonmark": "^1.0|^2.0",
+                "symfony/phpunit-bridge": "^6.4|^7.0",
+                "twig/cache-extra": "^3.0",
+                "twig/cssinliner-extra": "^3.0",
+                "twig/html-extra": "^3.0",
+                "twig/inky-extra": "^3.0",
+                "twig/intl-extra": "^3.0",
+                "twig/markdown-extra": "^3.0",
+                "twig/string-extra": "^3.0"
+            },
+            "type": "symfony-bundle",
+            "autoload": {
+                "psr-4": {
+                    "Twig\\Extra\\TwigExtraBundle\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                }
+            ],
+            "description": "A Symfony bundle for extra Twig extensions",
+            "homepage": "https://twig.symfony.com",
+            "keywords": [
+                "bundle",
+                "extra",
+                "twig"
+            ],
+            "support": {
+                "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.21.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2025-02-19T14:29:33+00:00"
+        },
+        {
+            "name": "twig/html-extra",
+            "version": "v3.21.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/html-extra.git",
+                "reference": "5442dd707601c83b8cd4233e37bb10ab8489a90f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/html-extra/zipball/5442dd707601c83b8cd4233e37bb10ab8489a90f",
+                "reference": "5442dd707601c83b8cd4233e37bb10ab8489a90f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1.0",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/mime": "^5.4|^6.4|^7.0",
+                "twig/twig": "^3.13|^4.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^6.4|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Twig\\Extra\\Html\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                }
+            ],
+            "description": "A Twig extension for HTML",
+            "homepage": "https://twig.symfony.com",
+            "keywords": [
+                "html",
+                "twig"
+            ],
+            "support": {
+                "source": "https://github.com/twigphp/html-extra/tree/v3.21.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2025-02-19T14:29:33+00:00"
+        },
         {
             "name": "twig/twig",
             "version": "v3.21.1",

+ 3 - 0
api/config/bundles.php

@@ -13,4 +13,7 @@ return [
     Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true],
     Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
     Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
+    Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
+    Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
+    EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true],
 ];

+ 11 - 0
api/config/packages/csrf.yaml

@@ -0,0 +1,11 @@
+# Enable stateless CSRF protection for forms and logins/logouts
+framework:
+    form:
+        csrf_protection:
+            token_id: submit
+
+    csrf_protection:
+        stateless_token_ids:
+            - submit
+            - authenticate
+            - logout

+ 5 - 0
api/config/packages/twig_component.yaml

@@ -0,0 +1,5 @@
+twig_component:
+    anonymous_template_directory: 'components/'
+    defaults:
+        # Namespace & directory for components
+        App\Twig\Components\: 'components/'

+ 3 - 0
api/config/routes/easyadmin.yaml

@@ -0,0 +1,3 @@
+easyadmin:
+    resource: .
+    type: easyadmin.routes

+ 50 - 0
api/src/Controller/Admin/DashboardController.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminDashboard;
+use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
+use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
+use Symfony\Component\HttpFoundation\Response;
+
+#[AdminDashboard(routePath: '/admin', routeName: 'admin')]
+class DashboardController extends AbstractDashboardController
+{
+    public function index(): Response
+    {
+        return parent::index();
+
+        // Option 1. You can make your dashboard redirect to some common page of your backend
+        //
+        // 1.1) If you have enabled the "pretty URLs" feature:
+        // return $this->redirectToRoute('admin_user_index');
+        //
+        // 1.2) Same example but using the "ugly URLs" that were used in previous EasyAdmin versions:
+        // $adminUrlGenerator = $this->container->get(AdminUrlGenerator::class);
+        // return $this->redirect($adminUrlGenerator->setController(OneOfYourCrudController::class)->generateUrl());
+
+        // Option 2. You can make your dashboard redirect to different pages depending on the user
+        //
+        // if ('jane' === $this->getUser()->getUsername()) {
+        //     return $this->redirectToRoute('...');
+        // }
+
+        // Option 3. You can render some custom template to display a proper dashboard with widgets, etc.
+        // (tip: it's easier if your template extends from @EasyAdmin/page/content.html.twig)
+        //
+        // return $this->render('some/path/my-dashboard.html.twig');
+    }
+
+    public function configureDashboard(): Dashboard
+    {
+        return Dashboard::new()
+            ->setTitle('Html');
+    }
+
+    public function configureMenuItems(): iterable
+    {
+        yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
+        // yield MenuItem::linkToCrud('The Label', 'fas fa-list', EntityClass::class);
+    }
+}

+ 64 - 0
api/src/Entity/Galaxy.php

@@ -0,0 +1,64 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Entity;
+
+use ApiPlatform\Metadata\ApiResource;
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\ORM\Mapping as ORM;
+
+#[ORM\Entity]
+#[ApiResource]
+class Galaxy
+{
+    #[ORM\Id]
+    #[ORM\GeneratedValue]
+    #[ORM\Column]
+    private ?int $id = null;
+
+    #[ORM\Column(length: 100, unique: true, nullable: false)]
+    private string $name;
+
+    /** @var Collection<int, Sector> */
+    #[ORM\OneToMany(targetEntity: Sector::class, mappedBy: 'galaxy', orphanRemoval: true)]
+    private Collection $sectors;
+
+    public function __construct()
+    {
+        $this->sectors = new ArrayCollection();
+    }
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function setId(?int $id): self
+    {
+        $this->id = $id;
+        return $this;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): self
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    public function getSectors(): Collection
+    {
+        return $this->sectors;
+    }
+
+    public function setSectors(Collection $sectors): self
+    {
+        $this->sectors = $sectors;
+        return $this;
+    }
+}

+ 117 - 0
api/src/Entity/Game.php

@@ -0,0 +1,117 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Entity;
+
+use ApiPlatform\Metadata\ApiResource;
+use App\Enum\GameStatusEnum;
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\DBAL\Types\Types;
+use Doctrine\ORM\Mapping as ORM;
+
+#[ORM\Entity]
+#[ApiResource]
+class Game
+{
+    #[ORM\Id]
+    #[ORM\GeneratedValue]
+    #[ORM\Column]
+    private ?int $id = null;
+
+    #[ORM\Column(length: 100, unique: true, nullable: false)]
+    private string $name;
+
+    #[ORM\OneToMany(targetEntity: Player::class, mappedBy: 'game', cascade: ['persist', 'remove'])]
+    private Collection $players;
+
+    #[ORM\OneToOne(targetEntity: Galaxy::class, mappedBy: 'game', cascade: ['persist', 'remove'])]
+    private ?Galaxy $galaxy = null;
+
+    #[ORM\Column(length: 24, enumType: GameStatusEnum::class, options: ['default' => GameStatusEnum::DRAFT])]
+    private GameStatusEnum $status = GameStatusEnum::DRAFT;
+
+    #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)]
+    private ?\DateTimeImmutable $openedAt = null;
+
+    public function __construct()
+    {
+        $this->players = new ArrayCollection();
+    }
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function setId(?int $id): self
+    {
+        $this->id = $id;
+        return $this;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): self
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    public function getPlayers(): Collection
+    {
+        return $this->players;
+    }
+
+    public function addPlayer(Player $player): self
+    {
+        if (!$this->players->contains($player)) {
+            $this->players->add($player);
+            $player->setGame($this);
+        }
+
+        return $this;
+    }
+
+    public function removePlayer(Player $player): self
+    {
+        $this->players->removeElement($player);
+        return $this;
+    }
+
+    public function getGalaxy(): ?Galaxy
+    {
+        return $this->galaxy;
+    }
+
+    public function setGalaxy(?Galaxy $galaxy): self
+    {
+        $this->galaxy = $galaxy;
+        return $this;
+    }
+
+    public function getOpenedAt(): ?\DateTimeImmutable
+    {
+        return $this->openedAt;
+    }
+
+    public function setOpenedAt(?\DateTimeImmutable $openedAt): self
+    {
+        $this->openedAt = $openedAt;
+        return $this;
+    }
+
+    public function getStatus(): GameStatusEnum
+    {
+        return $this->status;
+    }
+
+    public function setStatus(GameStatusEnum $status): self
+    {
+        $this->status = $status;
+        return $this;
+    }
+}

+ 91 - 0
api/src/Entity/Planet.php

@@ -0,0 +1,91 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Entity;
+
+use ApiPlatform\Metadata\ApiResource;
+use App\Enum\CelestialBodySizeEnum;
+use App\Enum\PlanetTypeEnum;
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Validator\Constraints as Assert;
+
+
+#[ORM\Entity]
+#[ApiResource]
+class Planet
+{
+    #[ORM\Id]
+    #[ORM\GeneratedValue]
+    #[ORM\Column]
+    private ?int $id = null;
+
+    #[ORM\Column(length: 100, nullable: false)]
+    private string $name;
+
+    #[ORM\Column(length: 24, enumType: PlanetTypeEnum::class, options: ['default' => PlanetTypeEnum::UNINHABITABLE])]
+    private PlanetTypeEnum $type;
+
+    #[ORM\Column(nullable: true)]
+    #[Assert\Range(notInRangeMessage: 'between_{{ min }}_and_{{ max }}', min: 1, max: 7)]
+    private ?int $position = null;
+
+    #[ORM\Column(length: 3, enumType: CelestialBodySizeEnum::class, options: ['default' => CelestialBodySizeEnum::M])]
+    private CelestialBodySizeEnum $size = CelestialBodySizeEnum::M;
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function setId(?int $id): self
+    {
+        $this->id = $id;
+        return $this;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): self
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    public function getType(): PlanetTypeEnum
+    {
+        return $this->type;
+    }
+
+    public function setType(PlanetTypeEnum $type): self
+    {
+        $this->type = $type;
+        return $this;
+    }
+
+    public function getPosition(): ?int
+    {
+        return $this->position;
+    }
+
+    public function setPosition(?int $position): self
+    {
+        $this->position = $position;
+        return $this;
+    }
+
+    public function getSize(): CelestialBodySizeEnum
+    {
+        return $this->size;
+    }
+
+    public function setSize(CelestialBodySizeEnum $size): self
+    {
+        $this->size = $size;
+        return $this;
+    }
+}

+ 35 - 5
api/src/Entity/User/GameParticipation.php → api/src/Entity/Player.php

@@ -1,17 +1,19 @@
 <?php
 declare(strict_types=1);
 
-namespace App\Entity\User;
+namespace App\Entity;
 
 use ApiPlatform\Metadata\ApiResource;
+use App\Enum\CareerEnum;
+use App\Enum\PlayerStatusEnum;
 use Doctrine\DBAL\Types\Types;
 use Doctrine\ORM\Mapping as ORM;
 
 #[ORM\Entity]
-#[ORM\Table(name: 'game_participations')]
+#[ORM\Table(name: 'player')]
 #[ORM\UniqueConstraint(name: 'unique_user_game', columns: ['user_id', 'game_id'])]
 #[ApiResource]
-class GameParticipation
+class Player
 {
     #[ORM\Id]
     #[ORM\GeneratedValue]
@@ -26,11 +28,17 @@ class GameParticipation
     #[ORM\JoinColumn(nullable: false)]
     private Game $game;
 
+    #[ORM\Column(length: 100, nullable: false)]
+    private string $name;
+
+    #[ORM\Column(length: 24, enumType: CareerEnum::class, options: ['default' => CareerEnum::CORPORATION_EMPLOYEE])]
+    private CareerEnum $career = CareerEnum::CORPORATION_EMPLOYEE;
+
     #[ORM\Column(type: Types::DATETIME_IMMUTABLE)]
     private \DateTimeImmutable $joinedAt;
 
-    #[ORM\Column(length: 20, nullable: false, options: ['default' => 'active'])]
-    private string $status = 'active';
+    #[ORM\Column(length: 24, enumType: PlayerStatusEnum::class, options: ['default' => PlayerStatusEnum::ACTIVE])]
+    private PlayerStatusEnum $status = PlayerStatusEnum::ACTIVE;
 
     #[ORM\Column(nullable: true)]
     private ?int $score = null;
@@ -70,6 +78,28 @@ class GameParticipation
         return $this;
     }
 
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): self
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    public function getCareer(): CareerEnum
+    {
+        return $this->career;
+    }
+
+    public function setCareer(CareerEnum $career): self
+    {
+        $this->career = $career;
+        return $this;
+    }
+
     public function getJoinedAt(): \DateTimeImmutable
     {
         return $this->joinedAt;

+ 23 - 16
api/src/Entity/User/Game.php → api/src/Entity/Sector.php

@@ -1,32 +1,38 @@
 <?php
 declare(strict_types=1);
 
-namespace App\Entity\User;
+namespace App\Entity;
 
 use ApiPlatform\Metadata\ApiResource;
+use App\Enum\SectorStatusEnum;
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\Common\Collections\Collection;
 use Doctrine\ORM\Mapping as ORM;
 use Symfony\Component\Validator\Constraints as Assert;
 
+
 #[ORM\Entity]
 #[ApiResource]
-class Game
+class Sector
 {
     #[ORM\Id]
     #[ORM\GeneratedValue]
     #[ORM\Column]
     private ?int $id = null;
 
-    #[ORM\Column(length: 100, unique: true, nullable: false)]
+    #[ORM\Column(length: 100, nullable: false)]
     private string $name;
 
-    #[ORM\OneToMany(targetEntity: GameParticipation::class, mappedBy: 'game', cascade: ['persist', 'remove'])]
-    private Collection $gameParticipations;
+    /** @var Collection<int, System> */
+    #[ORM\OneToMany(targetEntity: System::class, mappedBy: 'sector', orphanRemoval: true)]
+    private Collection $systems;
+
+    #[ORM\Column(length: 24, enumType: SectorStatusEnum::class, options: ['default' => SectorStatusEnum::UNEXPLORED])]
+    private SectorStatusEnum $status = SectorStatusEnum::UNEXPLORED;
 
     public function __construct()
     {
-        $this->gameParticipations = new ArrayCollection();
+        $this->systems = new ArrayCollection();
     }
 
     public function getId(): ?int
@@ -51,24 +57,25 @@ class Game
         return $this;
     }
 
-    public function getGameParticipations(): Collection
+    public function getSystems(): Collection
     {
-        return $this->gameParticipations;
+        return $this->systems;
     }
 
-    public function addGameParticipation(GameParticipation $gameParticipation): self
+    public function setSystems(Collection $systems): self
     {
-        if (!$this->gameParticipations->contains($gameParticipation)) {
-            $this->gameParticipations->add($gameParticipation);
-            $gameParticipation->setGame($this);
-        }
-
+        $this->systems = $systems;
         return $this;
     }
 
-    public function removeGameParticipation(GameParticipation $gameParticipation): self
+    public function getStatus(): SectorStatusEnum
+    {
+        return $this->status;
+    }
+
+    public function setStatus(SectorStatusEnum $status): self
     {
-        $this->gameParticipations->removeElement($gameParticipation);
+        $this->status = $status;
         return $this;
     }
 }

+ 111 - 0
api/src/Entity/System.php

@@ -0,0 +1,111 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Entity;
+
+use ApiPlatform\Metadata\ApiResource;
+use App\Enum\CelestialBodySizeEnum;
+use App\Enum\StarTypeEnum;
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Validator\Constraints as Assert;
+
+
+#[ORM\Entity]
+#[ApiResource]
+class System
+{
+    #[ORM\Id]
+    #[ORM\GeneratedValue]
+    #[ORM\Column]
+    private ?int $id = null;
+
+    #[ORM\Column(length: 100, nullable: false)]
+    private string $name;
+
+    /** @var Collection<int, Planet> */
+    #[ORM\OneToMany(targetEntity: Planet::class, mappedBy: 'system', orphanRemoval: true)]
+    private Collection $planets;
+
+    #[ORM\Column(length: 20, enumType: StarTypeEnum::class, options: ['default' => StarTypeEnum::RED_DWARF])]
+    private StarTypeEnum $starType = StarTypeEnum::RED_DWARF;
+
+    #[ORM\Column(length: 3, enumType: CelestialBodySizeEnum::class, options: ['default' => CelestialBodySizeEnum::M])]
+    private CelestialBodySizeEnum $starSize = CelestialBodySizeEnum::M;
+
+    #[ORM\Column(nullable: true)]
+    #[Assert\Range(notInRangeMessage: 'between_{{ min }}_and_{{ max }}', min: 0, max: 7)]
+    private int $asteroidBeltPosition = 0;
+
+    public function __construct()
+    {
+        $this->planets = new ArrayCollection();
+    }
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function setId(?int $id): self
+    {
+        $this->id = $id;
+        return $this;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function setName(string $name): self
+    {
+        $this->name = $name;
+        return $this;
+    }
+
+    public function getPlanets(): Collection
+    {
+        return $this->planets;
+    }
+
+    public function setPlanets(Collection $planets): self
+    {
+        $this->planets = $planets;
+        return $this;
+    }
+
+    public function getStarType(): StarTypeEnum
+    {
+        return $this->starType;
+    }
+
+    public function setStarType(StarTypeEnum $starType): self
+    {
+        $this->starType = $starType;
+        return $this;
+    }
+
+    public function getStarSize(): CelestialBodySizeEnum
+    {
+        return $this->starSize;
+    }
+
+    public function setStarSize(CelestialBodySizeEnum $starSize): self
+    {
+        $this->starSize = $starSize;
+        return $this;
+    }
+
+    public function getAsteroidBeltPosition(): int
+    {
+        return $this->asteroidBeltPosition;
+    }
+
+    public function setAsteroidBeltPosition(int $asteroidBeltPosition): self
+    {
+        $this->asteroidBeltPosition = $asteroidBeltPosition;
+        return $this;
+    }
+}

+ 13 - 13
api/src/Entity/User/User.php → api/src/Entity/User.php

@@ -1,11 +1,11 @@
 <?php
 declare(strict_types=1);
 
-namespace App\Entity\User;
+namespace App\Entity;
 
 use ApiPlatform\Metadata\ApiResource;
-use Doctrine\Common\Collections\Collection;
 use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
 use Doctrine\ORM\Mapping as ORM;
 use Symfony\Component\Validator\Constraints as Assert;
 
@@ -28,12 +28,12 @@ class User
     #[ORM\Column(length: 100, nullable: false)]
     private string $password;
 
-    #[ORM\OneToMany(mappedBy: 'user', targetEntity: GameParticipation::class, cascade: ['persist', 'remove'])]
-    private Collection $gameParticipations;
+    #[ORM\OneToMany(targetEntity: Player::class, mappedBy: 'user', cascade: ['persist', 'remove'])]
+    private Collection $players;
 
     public function __construct()
     {
-        $this->gameParticipations = new ArrayCollection();
+        $this->players = new ArrayCollection();
     }
 
     public function getId(): ?int
@@ -80,24 +80,24 @@ class User
         return $this;
     }
 
-    public function getGameParticipations(): Collection
+    public function getPlayers(): Collection
     {
-        return $this->gameParticipations;
+        return $this->players;
     }
 
-    public function addGameParticipation(GameParticipation $gameParticipation): self
+    public function addPlayer(Player $player): self
     {
-        if (!$this->gameParticipations->contains($gameParticipation)) {
-            $this->gameParticipations->add($gameParticipation);
-            $gameParticipation->setUser($this);
+        if (!$this->players->contains($player)) {
+            $this->players->add($player);
+            $player->setUser($this);
         }
 
         return $this;
     }
 
-    public function removeGameParticipation(GameParticipation $gameParticipation): self
+    public function removePlayer(Player $player): self
     {
-        $this->gameParticipations->removeElement($gameParticipation);
+        $this->players->removeElement($player);
         return $this;
     }
 }

+ 11 - 0
api/src/Enum/CareerEnum.php

@@ -0,0 +1,11 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum CareerEnum: string
+{
+    case CORPORATION_EMPLOYEE = 'CORPORATION_EMPLOYEE';
+    case INDEPENDANT = 'INDEPENDANT';
+    case PIRATE = 'PIRATE';
+}

+ 14 - 0
api/src/Enum/CelestialBodySizeEnum.php

@@ -0,0 +1,14 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum CelestialBodySizeEnum: string
+{
+    case XS = 'XS';
+    case S = 'S';
+    case M = 'M';
+    case L = 'L';
+    case XL = 'XL';
+    case XXL = 'XXL';
+}

+ 11 - 0
api/src/Enum/GameStatusEnum.php

@@ -0,0 +1,11 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum GameStatusEnum: string
+{
+    case DRAFT = 'DRAFT';
+    case OPEN = 'OPEN';
+    case CLOSED = 'CLOSED';
+}

+ 11 - 0
api/src/Enum/PlanetTypeEnum.php

@@ -0,0 +1,11 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum PlanetTypeEnum: string
+{
+    case INHABITABLE = 'INHABITABLE';
+    case TERRAFORMABLE = 'TERRAFORMABLE';
+    case UNINHABITABLE = 'UNINHABITABLE';
+}

+ 10 - 0
api/src/Enum/PlayerStatusEnum.php

@@ -0,0 +1,10 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum PlayerStatusEnum: string
+{
+    case ACTIVE = 'ACTIVE';
+    case INACTIVE = 'INACTIVE';
+}

+ 11 - 0
api/src/Enum/SectorStatusEnum.php

@@ -0,0 +1,11 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum SectorStatusEnum: string
+{
+    case CENTRAL = 'CENTRAL';
+    case EXPLORED = 'EXPLORED';
+    case UNEXPLORED = 'UNEXPLORED';
+}

+ 15 - 0
api/src/Enum/StarTypeEnum.php

@@ -0,0 +1,15 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum;
+
+enum StarTypeEnum: string
+{
+    case RED_DWARF = 'RED_DWARF';
+    case ORANGE_DWARF = 'ORANGE_DWARF';
+    case YELLOW_DWARF = 'YELLOW_DWARF';
+    case SUB_GIANT = 'SUB_GIANT';
+    case F_STAR = 'F_STAR';
+    case A_STAR = 'G_STAR';
+    case T_STAR = 'K_STAR';
+}

+ 39 - 0
api/symfony.lock

@@ -49,6 +49,18 @@
             "migrations/.gitignore"
         ]
     },
+    "easycorp/easyadmin-bundle": {
+        "version": "4.26",
+        "recipe": {
+            "repo": "github.com/symfony/recipes",
+            "branch": "main",
+            "version": "4.14",
+            "ref": "13b3e524d1038a6861ad6c7fc64e31b644ba0c54"
+        },
+        "files": [
+            "config/routes/easyadmin.yaml"
+        ]
+    },
     "nelmio/cors-bundle": {
         "version": "2.5",
         "recipe": {
@@ -120,6 +132,18 @@
             ".env"
         ]
     },
+    "symfony/form": {
+        "version": "7.3",
+        "recipe": {
+            "repo": "github.com/symfony/recipes",
+            "branch": "main",
+            "version": "7.2",
+            "ref": "7d86a6723f4a623f59e2bf966b6aad2fc461d36b"
+        },
+        "files": [
+            "config/packages/csrf.yaml"
+        ]
+    },
     "symfony/framework-bundle": {
         "version": "6.4",
         "recipe": {
@@ -293,6 +317,18 @@
             "config/packages/uid.yaml"
         ]
     },
+    "symfony/ux-twig-component": {
+        "version": "2.30",
+        "recipe": {
+            "repo": "github.com/symfony/recipes",
+            "branch": "main",
+            "version": "2.13",
+            "ref": "f367ae2a1faf01c503de2171f1ec22567febeead"
+        },
+        "files": [
+            "config/packages/twig_component.yaml"
+        ]
+    },
     "symfony/validator": {
         "version": "6.4",
         "recipe": {
@@ -317,5 +353,8 @@
             "config/packages/web_profiler.yaml",
             "config/routes/web_profiler.yaml"
         ]
+    },
+    "twig/extra-bundle": {
+        "version": "v3.21.0"
     }
 }