internship 2 роки тому
батько
коміт
148620e87d

+ 52 - 29
.idea/internship-playground.iml

@@ -6,38 +6,61 @@
       <sourceFolder url="file://$MODULE_DIR$/src-php/app/internship" isTestSource="false" packagePrefix="custom\" />
       <sourceFolder url="file://$MODULE_DIR$/src-php/test/internship" isTestSource="true" packagePrefix="custom\" />
       <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/myclabs/deep-copy" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/nikic/php-parser" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/composer" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phar-io/manifest" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phar-io/version" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/doctrine/instantiator" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-persistence" />
       <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/theseer/tokenizer" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/cli-parser" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/code-unit" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/code-unit-reverse-lookup" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/comparator" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/complexity" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/diff" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-code-coverage" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/environment" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-file-iterator" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/exporter" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-invoker" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/global-state" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-text-template" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/lines-of-code" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-timer" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/object-enumerator" />
       <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/phpunit" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/object-reflector" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/recursion-context" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/resource-operations" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/type" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/version" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/psr/container" />
-      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/psr/http-factory" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-timer" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-text-template" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-invoker" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-file-iterator" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phpunit/php-code-coverage" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phar-io/version" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-mail" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/phar-io/manifest" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-log4php" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/myclabs/deep-copy" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-l10n" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/nikic/php-parser" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-io" />
       <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/psr/http-message" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-impl-web-ui" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/psr/http-factory" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-impl-web-dispatch" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/psr/container" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/phpbob" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-impl-persistence-orm" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-web" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-impl-persistence-meta" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/version" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-context" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-validation" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/type" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-util" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-config" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/resource-operations" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-test" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-composer-module-installer" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/recursion-context" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-bind" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-reflection" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/object-reflector" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n-batch" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/object-enumerator" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/n2n" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/lines-of-code" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/hangar-api" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/global-state" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/n2n/hangar" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/exporter" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/environment" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/diff" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/complexity" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/comparator" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/code-unit-reverse-lookup" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/code-unit" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/sebastian/cli-parser" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/doctrine/instantiator" />
+      <excludeFolder url="file://$MODULE_DIR$/src-php/vendor/composer" />
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />

+ 45 - 43
.idea/php.xml

@@ -12,59 +12,61 @@
   <component name="PhpIncludePathManager">
     <include_path>
       <path value="$PROJECT_DIR$/vendor/n2n/n2n-composer-module-installer" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-persistence" />
+      <path value="$PROJECT_DIR$/src-php/vendor/theseer/tokenizer" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/phpunit" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-timer" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-text-template" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-invoker" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-file-iterator" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-code-coverage" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phar-io/version" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-mail" />
+      <path value="$PROJECT_DIR$/src-php/vendor/phar-io/manifest" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-log4php" />
       <path value="$PROJECT_DIR$/src-php/vendor/myclabs/deep-copy" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-l10n" />
       <path value="$PROJECT_DIR$/src-php/vendor/nikic/php-parser" />
-      <path value="$PROJECT_DIR$/src-php/vendor/composer" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-composer-module-installer" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-config" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/hangar" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-io" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-mail" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-log4php" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-reflection" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-impl-web-dispatch" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-test" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-util" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n" />
+      <path value="$PROJECT_DIR$/src-php/vendor/psr/http-message" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-impl-web-ui" />
+      <path value="$PROJECT_DIR$/src-php/vendor/psr/http-factory" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-impl-web-dispatch" />
+      <path value="$PROJECT_DIR$/src-php/vendor/psr/container" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/phpbob" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-impl-persistence-orm" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-web" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phar-io/manifest" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-impl-persistence-meta" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phar-io/version" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/hangar-api" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-persistence" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/version" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-context" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-impl-persistence-orm" />
-      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-l10n" />
-      <path value="$PROJECT_DIR$/src-php/vendor/doctrine/instantiator" />
-      <path value="$PROJECT_DIR$/src-php/vendor/theseer/tokenizer" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/cli-parser" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/code-unit" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/code-unit-reverse-lookup" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/comparator" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/complexity" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/diff" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-code-coverage" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/environment" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-file-iterator" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/exporter" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-invoker" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/global-state" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-text-template" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/lines-of-code" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/php-timer" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/object-enumerator" />
-      <path value="$PROJECT_DIR$/src-php/vendor/phpunit/phpunit" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/object-reflector" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-validation" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/type" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-util" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-config" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/resource-operations" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-test" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-composer-module-installer" />
       <path value="$PROJECT_DIR$/src-php/vendor/sebastian/recursion-context" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-bind" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-reflection" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/object-reflector" />
       <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n-batch" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/resource-operations" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/type" />
-      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/version" />
-      <path value="$PROJECT_DIR$/src-php/vendor/psr/container" />
-      <path value="$PROJECT_DIR$/src-php/vendor/psr/http-factory" />
-      <path value="$PROJECT_DIR$/src-php/vendor/psr/http-message" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/object-enumerator" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/n2n" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/lines-of-code" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/hangar-api" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/global-state" />
+      <path value="$PROJECT_DIR$/src-php/vendor/n2n/hangar" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/exporter" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/environment" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/diff" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/complexity" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/comparator" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/code-unit-reverse-lookup" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/code-unit" />
+      <path value="$PROJECT_DIR$/src-php/vendor/sebastian/cli-parser" />
+      <path value="$PROJECT_DIR$/src-php/vendor/doctrine/instantiator" />
+      <path value="$PROJECT_DIR$/src-php/vendor/composer" />
     </include_path>
   </component>
   <component name="PhpProjectSharedConfiguration" php_language_level="8.1" />

+ 2 - 1
composer.json

@@ -12,7 +12,8 @@
         "n2n/n2n-impl-persistence-meta": "^7.4",
         "n2n/n2n-impl-persistence-orm": "^7.4",
         "n2n/n2n-impl-web-dispatch": "^7.4",
-        "n2n/n2n-impl-web-ui": "^7.4"
+        "n2n/n2n-impl-web-ui": "^7.4",
+        "n2n/n2n-bind": "^7.4"
     },
     "require-dev": {
         "n2n/hangar": "^7.2.0",

+ 360 - 48
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": "b01b10d64c90cf3d3461d7e1b8b4caee",
+    "content-hash": "288befa3d2bafa77d248f419f5884cce",
     "packages": [
         {
             "name": "n2n/n2n",
@@ -12,12 +12,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n.git",
-                "reference": "4199ae27763c31c6430afe1abbcb529044aba6bd"
+                "reference": "b1a47dcd8e174b94f1a132f3070bfc51240fcd1c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n/zipball/4199ae27763c31c6430afe1abbcb529044aba6bd",
-                "reference": "4199ae27763c31c6430afe1abbcb529044aba6bd",
+                "url": "https://api.github.com/repos/n2n/n2n/zipball/b1a47dcd8e174b94f1a132f3070bfc51240fcd1c",
+                "reference": "b1a47dcd8e174b94f1a132f3070bfc51240fcd1c",
                 "shasum": ""
             },
             "require": {
@@ -64,7 +64,11 @@
                 "framework",
                 "n2n"
             ],
-            "time": "2023-02-28T23:56:17+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n/issues",
+                "source": "https://github.com/n2n/n2n/tree/develop"
+            },
+            "time": "2023-03-22T10:34:04+00:00"
         },
         {
             "name": "n2n/n2n-batch",
@@ -72,15 +76,16 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-batch.git",
-                "reference": "2ca33e0df12d7274a1b74ce7cdcba867d1ab656b"
+                "reference": "c20029bbcaf1a45dd531c746a51b286796cf4d88"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-batch/zipball/2ca33e0df12d7274a1b74ce7cdcba867d1ab656b",
-                "reference": "2ca33e0df12d7274a1b74ce7cdcba867d1ab656b",
+                "url": "https://api.github.com/repos/n2n/n2n-batch/zipball/c20029bbcaf1a45dd531c746a51b286796cf4d88",
+                "reference": "c20029bbcaf1a45dd531c746a51b286796cf4d88",
                 "shasum": ""
             },
             "require": {
+                "n2n/n2n": "~7.4",
                 "n2n/n2n-reflection": "~7.4",
                 "n2n/n2n-util": "~7.4"
             },
@@ -105,12 +110,66 @@
                 }
             ],
             "description": "batch job support for n2n framework",
-            "homepage": "http://n2n.rocks/",
+            "homepage": "https://n2n.rocks/",
             "keywords": [
                 "batch job",
                 "n2n"
             ],
-            "time": "2023-01-12T15:12:28+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-batch/issues",
+                "source": "https://github.com/n2n/n2n-batch/tree/master"
+            },
+            "time": "2023-03-20T14:15:20+00:00"
+        },
+        {
+            "name": "n2n/n2n-bind",
+            "version": "7.4.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/n2n/n2n-bind.git",
+                "reference": "a362ff43c9e8f08c03dfc0d43b01f21cf3dd7ea2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/n2n/n2n-bind/zipball/a362ff43c9e8f08c03dfc0d43b01f21cf3dd7ea2",
+                "reference": "a362ff43c9e8f08c03dfc0d43b01f21cf3dd7ea2",
+                "shasum": ""
+            },
+            "require": {
+                "n2n/n2n-util": "~7.4",
+                "n2n/n2n-validation": "~7.4"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5.25"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "n2n\\bind\\": "src/app/n2n/bind"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-3.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Andreas von Burg",
+                    "email": "a@von-burg.net",
+                    "homepage": "https://www.von-burg.net/"
+                }
+            ],
+            "description": "bind/json support for n2n framework",
+            "homepage": "https://n2n.rocks/",
+            "keywords": [
+                "batch job",
+                "n2n"
+            ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-bind/issues",
+                "source": "https://github.com/n2n/n2n-bind/tree/develop"
+            },
+            "time": "2023-03-07T17:00:09+00:00"
         },
         {
             "name": "n2n/n2n-composer-module-installer",
@@ -159,6 +218,10 @@
                 "module",
                 "n2n"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-composer-module-installer/issues",
+                "source": "https://github.com/n2n/n2n-composer-module-installer/tree/v7.1.6"
+            },
             "time": "2023-03-02T10:19:51+00:00"
         },
         {
@@ -204,6 +267,10 @@
                 "batch job",
                 "n2n"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-config/issues",
+                "source": "https://github.com/n2n/n2n-config/tree/develop"
+            },
             "time": "2022-12-19T15:51:52+00:00"
         },
         {
@@ -212,12 +279,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-context.git",
-                "reference": "985e48ffd861d12413b07addb6095c337733373e"
+                "reference": "d308c2a7d077c4115f8c4684bf47d033742e38cd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-context/zipball/985e48ffd861d12413b07addb6095c337733373e",
-                "reference": "985e48ffd861d12413b07addb6095c337733373e",
+                "url": "https://api.github.com/repos/n2n/n2n-context/zipball/d308c2a7d077c4115f8c4684bf47d033742e38cd",
+                "reference": "d308c2a7d077c4115f8c4684bf47d033742e38cd",
                 "shasum": ""
             },
             "require": {
@@ -257,7 +324,11 @@
                 "scope",
                 "session scope"
             ],
-            "time": "2023-01-09T22:27:53+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-context/issues",
+                "source": "https://github.com/n2n/n2n-context/tree/develop"
+            },
+            "time": "2023-03-19T23:27:51+00:00"
         },
         {
             "name": "n2n/n2n-impl-persistence-meta",
@@ -309,6 +380,10 @@
                 "n2n",
                 "persistence"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-impl-persistence-meta/issues",
+                "source": "https://github.com/n2n/n2n-impl-persistence-meta/tree/master"
+            },
             "time": "2023-02-28T22:32:39+00:00"
         },
         {
@@ -317,12 +392,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-impl-persistence-orm.git",
-                "reference": "8e6fc5b8ffb2c6dcfebace8e62086111b808c1f2"
+                "reference": "4f31c13205522de55390794c0468f89dcc0eca0c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-impl-persistence-orm/zipball/8e6fc5b8ffb2c6dcfebace8e62086111b808c1f2",
-                "reference": "8e6fc5b8ffb2c6dcfebace8e62086111b808c1f2",
+                "url": "https://api.github.com/repos/n2n/n2n-impl-persistence-orm/zipball/4f31c13205522de55390794c0468f89dcc0eca0c",
+                "reference": "4f31c13205522de55390794c0468f89dcc0eca0c",
                 "shasum": ""
             },
             "require": {
@@ -361,7 +436,11 @@
                 "orm",
                 "persistence"
             ],
-            "time": "2023-03-10T15:02:17+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-impl-persistence-orm/issues",
+                "source": "https://github.com/n2n/n2n-impl-persistence-orm/tree/develop"
+            },
+            "time": "2023-03-20T22:58:08+00:00"
         },
         {
             "name": "n2n/n2n-impl-web-dispatch",
@@ -412,6 +491,10 @@
                 "n2n",
                 "web"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-impl-web-dispatch/issues",
+                "source": "https://github.com/n2n/n2n-impl-web-dispatch/tree/7.4.x"
+            },
             "time": "2023-01-12T14:50:45+00:00"
         },
         {
@@ -463,6 +546,10 @@
                 "n2n",
                 "xml"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-impl-web-ui/issues",
+                "source": "https://github.com/n2n/n2n-impl-web-ui/tree/develop"
+            },
             "time": "2023-01-12T14:55:44+00:00"
         },
         {
@@ -471,12 +558,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-io.git",
-                "reference": "c35fded41972acee66a9281c9e86660b4b418c4e"
+                "reference": "efff339ef47089585c2b3712bfc4e85610cf41da"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-io/zipball/c35fded41972acee66a9281c9e86660b4b418c4e",
-                "reference": "c35fded41972acee66a9281c9e86660b4b418c4e",
+                "url": "https://api.github.com/repos/n2n/n2n-io/zipball/efff339ef47089585c2b3712bfc4e85610cf41da",
+                "reference": "efff339ef47089585c2b3712bfc4e85610cf41da",
                 "shasum": ""
             },
             "require": {
@@ -484,6 +571,7 @@
                 "n2n/n2n-util": "~7.4"
             },
             "require-dev": {
+                "n2n/n2n": "~7.4",
                 "phpunit/phpunit": "^9.5"
             },
             "type": "library",
@@ -510,7 +598,11 @@
                 "io",
                 "n2n"
             ],
-            "time": "2023-02-28T23:28:17+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-io/issues",
+                "source": "https://github.com/n2n/n2n-io/tree/develop"
+            },
+            "time": "2023-03-17T22:18:57+00:00"
         },
         {
             "name": "n2n/n2n-l10n",
@@ -555,6 +647,10 @@
                 "l10n",
                 "n2n"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-l10n/issues",
+                "source": "https://github.com/n2n/n2n-l10n/tree/develop"
+            },
             "time": "2023-03-06T14:09:11+00:00"
         },
         {
@@ -590,6 +686,10 @@
                 "log4php",
                 "n2n"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-log4php/issues",
+                "source": "https://github.com/n2n/n2n-log4php/tree/v7.3.0"
+            },
             "time": "2022-05-30T14:43:08+00:00"
         },
         {
@@ -598,16 +698,16 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-mail.git",
-                "reference": "21321fbc0596bec473e0846ee73a44e1c2acc08d"
+                "reference": "bb2ae9fb28bd1223085ea64b8d1660eef3372d8b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-mail/zipball/21321fbc0596bec473e0846ee73a44e1c2acc08d",
-                "reference": "21321fbc0596bec473e0846ee73a44e1c2acc08d",
+                "url": "https://api.github.com/repos/n2n/n2n-mail/zipball/bb2ae9fb28bd1223085ea64b8d1660eef3372d8b",
+                "reference": "bb2ae9fb28bd1223085ea64b8d1660eef3372d8b",
                 "shasum": ""
             },
             "require": {
-                "n2n/n2n-util": "~7.3"
+                "n2n/n2n-util": "~7.4"
             },
             "require-dev": {
                 "phpunit/phpunit": "^9.5"
@@ -635,7 +735,11 @@
                 "mail",
                 "n2n"
             ],
-            "time": "2022-11-16T17:47:26+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-mail/issues",
+                "source": "https://github.com/n2n/n2n-mail/tree/develop"
+            },
+            "time": "2023-03-20T16:47:42+00:00"
         },
         {
             "name": "n2n/n2n-persistence",
@@ -643,12 +747,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-persistence.git",
-                "reference": "257fc7081a5e5247cf83b06c19a3a6b5bfa5ea05"
+                "reference": "dcb1d828180d9845c83be709c43366c0da615e85"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-persistence/zipball/257fc7081a5e5247cf83b06c19a3a6b5bfa5ea05",
-                "reference": "257fc7081a5e5247cf83b06c19a3a6b5bfa5ea05",
+                "url": "https://api.github.com/repos/n2n/n2n-persistence/zipball/dcb1d828180d9845c83be709c43366c0da615e85",
+                "reference": "dcb1d828180d9845c83be709c43366c0da615e85",
                 "shasum": ""
             },
             "require": {
@@ -686,7 +790,11 @@
                 "orm",
                 "persistence"
             ],
-            "time": "2023-03-10T15:00:03+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-persistence/issues",
+                "source": "https://github.com/n2n/n2n-persistence/tree/develop"
+            },
+            "time": "2023-03-20T23:09:25+00:00"
         },
         {
             "name": "n2n/n2n-reflection",
@@ -694,12 +802,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-reflection.git",
-                "reference": "3612cdf2abb3e9ca92e2034d200aa8835b2f576a"
+                "reference": "74f46f001496cacef5a36ba6653bdb0ada8a833e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-reflection/zipball/3612cdf2abb3e9ca92e2034d200aa8835b2f576a",
-                "reference": "3612cdf2abb3e9ca92e2034d200aa8835b2f576a",
+                "url": "https://api.github.com/repos/n2n/n2n-reflection/zipball/74f46f001496cacef5a36ba6653bdb0ada8a833e",
+                "reference": "74f46f001496cacef5a36ba6653bdb0ada8a833e",
                 "shasum": ""
             },
             "require": {
@@ -732,7 +840,11 @@
                 "awesome",
                 "framework"
             ],
-            "time": "2023-01-24T14:02:03+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-reflection/issues",
+                "source": "https://github.com/n2n/n2n-reflection/tree/develop"
+            },
+            "time": "2023-03-19T23:06:11+00:00"
         },
         {
             "name": "n2n/n2n-util",
@@ -740,12 +852,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-util.git",
-                "reference": "44d6561e36be439f08ff247c7aeafb4c3c29b263"
+                "reference": "9e7c77dd498c49523fb636aae624bc017a02f1af"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-util/zipball/44d6561e36be439f08ff247c7aeafb4c3c29b263",
-                "reference": "44d6561e36be439f08ff247c7aeafb4c3c29b263",
+                "url": "https://api.github.com/repos/n2n/n2n-util/zipball/9e7c77dd498c49523fb636aae624bc017a02f1af",
+                "reference": "9e7c77dd498c49523fb636aae624bc017a02f1af",
                 "shasum": ""
             },
             "require": {
@@ -779,7 +891,62 @@
                 "n2n",
                 "util"
             ],
-            "time": "2023-03-07T23:28:42+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-util/issues",
+                "source": "https://github.com/n2n/n2n-util/tree/develop"
+            },
+            "time": "2023-03-22T14:42:38+00:00"
+        },
+        {
+            "name": "n2n/n2n-validation",
+            "version": "7.4.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/n2n/n2n-validation.git",
+                "reference": "74fbfc4546dd7a70f08eba7eacd57a66e2f2f834"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/n2n/n2n-validation/zipball/74fbfc4546dd7a70f08eba7eacd57a66e2f2f834",
+                "reference": "74fbfc4546dd7a70f08eba7eacd57a66e2f2f834",
+                "shasum": ""
+            },
+            "require": {
+                "n2n/n2n-l10n": "~7.4",
+                "n2n/n2n-reflection": "~7.4",
+                "n2n/n2n-util": "~7.4"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "n2n\\validation\\": "src/app/n2n/validation"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-3.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Andreas von Burg",
+                    "email": "a@von-burg.net",
+                    "homepage": "https://www.von-burg.net/"
+                }
+            ],
+            "description": "bind/json support for n2n framework",
+            "homepage": "http://n2n.rocks/",
+            "keywords": [
+                "batch job",
+                "n2n"
+            ],
+            "support": {
+                "issues": "https://github.com/n2n/n2n-validation/issues",
+                "source": "https://github.com/n2n/n2n-validation/tree/develop"
+            },
+            "time": "2023-03-06T13:09:22+00:00"
         },
         {
             "name": "n2n/n2n-web",
@@ -787,12 +954,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-web.git",
-                "reference": "9a105353213ba7f2f1ae8b756e9e96e606d74ceb"
+                "reference": "e567a7fbbfde12c8fcad5be6dc78b487a128cd19"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-web/zipball/9a105353213ba7f2f1ae8b756e9e96e606d74ceb",
-                "reference": "9a105353213ba7f2f1ae8b756e9e96e606d74ceb",
+                "url": "https://api.github.com/repos/n2n/n2n-web/zipball/e567a7fbbfde12c8fcad5be6dc78b487a128cd19",
+                "reference": "e567a7fbbfde12c8fcad5be6dc78b487a128cd19",
                 "shasum": ""
             },
             "require": {
@@ -835,7 +1002,11 @@
                 "n2n",
                 "rest"
             ],
-            "time": "2023-03-13T11:26:49+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-web/issues",
+                "source": "https://github.com/n2n/n2n-web/tree/develop"
+            },
+            "time": "2023-03-21T17:31:17+00:00"
         },
         {
             "name": "psr/container",
@@ -884,6 +1055,10 @@
                 "container-interop",
                 "psr"
             ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/2.0.2"
+            },
             "time": "2021-11-05T16:47:00+00:00"
         },
         {
@@ -936,6 +1111,9 @@
                 "request",
                 "response"
             ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory/tree/master"
+            },
             "time": "2019-04-30T12:38:16+00:00"
         },
         {
@@ -986,6 +1164,9 @@
                 "request",
                 "response"
             ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/master"
+            },
             "time": "2016-08-06T14:39:51+00:00"
         }
     ],
@@ -1040,6 +1221,10 @@
                 "constructor",
                 "instantiate"
             ],
+            "support": {
+                "issues": "https://github.com/doctrine/instantiator/issues",
+                "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+            },
             "funding": [
                 {
                     "url": "https://www.doctrine-project.org/sponsorship.html",
@@ -1103,6 +1288,10 @@
                 "object",
                 "object graph"
             ],
+            "support": {
+                "issues": "https://github.com/myclabs/DeepCopy/issues",
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+            },
             "funding": [
                 {
                     "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
@@ -1155,6 +1344,10 @@
                 "hangar",
                 "n2n"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/hangar/issues",
+                "source": "https://github.com/n2n/hangar/tree/v7.3.1"
+            },
             "time": "2023-01-31T11:19:32+00:00"
         },
         {
@@ -1205,6 +1398,10 @@
                 "hangar",
                 "n2n"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/hangar-api/issues",
+                "source": "https://github.com/n2n/hangar-api/tree/1.0.x"
+            },
             "time": "2021-07-31T17:30:07+00:00"
         },
         {
@@ -1213,18 +1410,21 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/n2n/n2n-test.git",
-                "reference": "051069b0244f0e8ab05ac3e2d01dc2c2f0a2b25a"
+                "reference": "ae196801e30499b05bd5c28a871e396fb9bac128"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/n2n/n2n-test/zipball/051069b0244f0e8ab05ac3e2d01dc2c2f0a2b25a",
-                "reference": "051069b0244f0e8ab05ac3e2d01dc2c2f0a2b25a",
+                "url": "https://api.github.com/repos/n2n/n2n-test/zipball/ae196801e30499b05bd5c28a871e396fb9bac128",
+                "reference": "ae196801e30499b05bd5c28a871e396fb9bac128",
                 "shasum": ""
             },
             "require": {
                 "n2n/n2n-util": "^7.2.33"
             },
             "require-dev": {
+                "n2n/n2n": "~7.4",
+                "n2n/n2n-persistence": "~7.4",
+                "n2n/n2n-web": "~7.4",
                 "phpunit/phpunit": "^9.5"
             },
             "type": "library",
@@ -1252,7 +1452,11 @@
                 "test",
                 "utils"
             ],
-            "time": "2023-02-03T12:19:17+00:00"
+            "support": {
+                "issues": "https://github.com/n2n/n2n-test/issues",
+                "source": "https://github.com/n2n/n2n-test/tree/develop"
+            },
+            "time": "2023-03-20T01:59:13+00:00"
         },
         {
             "name": "n2n/phpbob",
@@ -1298,6 +1502,10 @@
                 "n2n",
                 "phpbob"
             ],
+            "support": {
+                "issues": "https://github.com/n2n/phpbob/issues",
+                "source": "https://github.com/n2n/phpbob/tree/develop"
+            },
             "time": "2023-01-09T17:41:07+00:00"
         },
         {
@@ -1350,6 +1558,10 @@
                 "parser",
                 "php"
             ],
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4"
+            },
             "time": "2023-03-05T19:49:14+00:00"
         },
         {
@@ -1406,6 +1618,10 @@
                 }
             ],
             "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+            "support": {
+                "issues": "https://github.com/phar-io/manifest/issues",
+                "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+            },
             "time": "2021-07-20T11:28:43+00:00"
         },
         {
@@ -1453,6 +1669,10 @@
                 }
             ],
             "description": "Library for handling version information and constraints",
+            "support": {
+                "issues": "https://github.com/phar-io/version/issues",
+                "source": "https://github.com/phar-io/version/tree/3.2.1"
+            },
             "time": "2022-02-21T01:04:05+00:00"
         },
         {
@@ -1520,6 +1740,10 @@
                 "testing",
                 "xunit"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1576,6 +1800,10 @@
                 "filesystem",
                 "iterator"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1635,6 +1863,10 @@
             "keywords": [
                 "process"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1690,6 +1922,10 @@
             "keywords": [
                 "template"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1745,6 +1981,10 @@
             "keywords": [
                 "timer"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1835,6 +2075,10 @@
                 "testing",
                 "xunit"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5"
+            },
             "funding": [
                 {
                     "url": "https://phpunit.de/sponsors.html",
@@ -1895,6 +2139,10 @@
             ],
             "description": "Library for parsing CLI options",
             "homepage": "https://github.com/sebastianbergmann/cli-parser",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1947,6 +2195,10 @@
             ],
             "description": "Collection of value objects that represent the PHP code units",
             "homepage": "https://github.com/sebastianbergmann/code-unit",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -1998,6 +2250,10 @@
             ],
             "description": "Looks up which function or method a line of code belongs to",
             "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2068,6 +2324,10 @@
                 "compare",
                 "equality"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/comparator/issues",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2121,6 +2381,10 @@
             ],
             "description": "Library for calculating the complexity of PHP code units",
             "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2183,6 +2447,10 @@
                 "unidiff",
                 "unified diff"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
+                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2242,6 +2510,10 @@
                 "environment",
                 "hhvm"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/environment/issues",
+                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2315,6 +2587,10 @@
                 "export",
                 "exporter"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/exporter/issues",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2375,6 +2651,10 @@
             "keywords": [
                 "global state"
             ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/global-state/issues",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2428,6 +2708,10 @@
             ],
             "description": "Library for counting the lines of code in PHP source code",
             "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2481,6 +2765,10 @@
             ],
             "description": "Traverses array structures and object graphs to enumerate all referenced objects",
             "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2532,6 +2820,10 @@
             ],
             "description": "Allows reflection of object attributes, including inherited and non-public ones",
             "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2591,6 +2883,10 @@
             ],
             "description": "Provides functionality to recursively process PHP variables",
             "homepage": "https://github.com/sebastianbergmann/recursion-context",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2642,6 +2938,10 @@
             ],
             "description": "Provides a list of PHP built-in functions that operate on resources",
             "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+                "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2694,6 +2994,10 @@
             ],
             "description": "Collection of value objects that represent the types of the PHP type system",
             "homepage": "https://github.com/sebastianbergmann/type",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/type/issues",
+                "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2743,6 +3047,10 @@
             ],
             "description": "Library that helps with managing the version number of Git-hosted PHP projects",
             "homepage": "https://github.com/sebastianbergmann/version",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/version/issues",
+                "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+            },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
@@ -2789,6 +3097,10 @@
                 }
             ],
             "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+            "support": {
+                "issues": "https://github.com/theseer/tokenizer/issues",
+                "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+            },
             "funding": [
                 {
                     "url": "https://github.com/theseer",
@@ -2805,5 +3117,5 @@
     "prefer-lowest": false,
     "platform": [],
     "platform-dev": [],
-    "plugin-api-version": "1.1.0"
+    "plugin-api-version": "2.3.0"
 }

+ 13 - 5
src-php/app/internship/bo/Article.php

@@ -2,10 +2,17 @@
 namespace internship\bo;
 
 use n2n\reflection\ObjectAdapter;
+use n2n\util\type\ArgUtils;
 
+enum CategoryName: string {
+	case sport = 'sport';
+	case national ='national';
+	case international = 'international';
+}
 class Article extends ObjectAdapter implements \JsonSerializable {
+
 	private int $id;
-	private string $categoryName;
+	private CategoryName $categoryName;
 	private string $text;
 	private string $title;
 
@@ -24,16 +31,17 @@ class Article extends ObjectAdapter implements \JsonSerializable {
 	}
 
 	/**
-	 * @return string
+	 * @return CategoryName
 	 */
-	public function getCategoryName(): string {
+	public function getCategoryName(): CategoryName {
 		return $this->categoryName;
 	}
 
 	/**
-	 * @param string $categoryName
+	 * @param CategoryName $categoryName
 	 */
-	public function setCategoryName(string $categoryName): void {
+	public function setCategoryName(CategoryName $categoryName): void  {
+		//ArgUtils::valEnum($categoryName, CategoryName::cases());
 		$this->categoryName = $categoryName;
 	}
 

+ 37 - 31
src-php/app/internship/controller/ArticleController.php

@@ -8,6 +8,11 @@ use n2n\web\http\controller\ParamBody;
 use internship\bo\Article;
 use n2n\web\http\PageNotFoundException;
 use n2n\web\http\BadRequestException;
+use n2n\bind\build\impl\Bind;
+use n2n\util\type\attrs\DataMap;
+use n2n\bind\mapper\impl\Mappers;
+use n2n\validation\validator\impl\Validators;
+use internship\bo\CategoryName;
 
 /**
  * REST Controller
@@ -113,22 +118,20 @@ class ArticleController extends ControllerAdapter {
 	 * @return void
 	 */
 	function postDoNewArticle(ParamBody $body): void {
-		$articleData = $body->parseJson();
-		if (!array_key_exists('title', $articleData)
-				|| !array_key_exists('text', $articleData)
-				|| !array_key_exists('categoryName', $articleData)) {
-			throw new BadRequestException('param: title, text, or categoryName is missing');
-		}
-		if (empty($articleData['title']) || empty($articleData['text']) || empty($articleData['categoryName'])) {
-			throw new BadRequestException('title, text, or categoryName is empty');
-		}
-		if (!in_array($articleData['categoryName'], ['international', 'national', 'sport'])) {
-			throw new BadRequestException('invalid category name');
-		}
+
+		$httpData = $body->parseJsonToHttpData();
 		$article = new Article();
-		$article->setTitle((substr_replace($articleData['title'], "", 255)));
-		$article->setText($articleData['text']);
-		$article->setCategoryName($articleData['categoryName']);
+
+		$result = $this->exec(Bind::attrs($httpData)->toObj($article)
+				->prop('categoryName', Mappers::cleanString(true), Validators::enum(
+						['international', 'national', 'sport']))
+				->prop('text', Mappers::cleanString(true, maxlength: 9999) )
+				->prop('title', Mappers::cleanString(true, minlength: 3, maxlength: 255)));
+
+		if ($result->hasErrors()) {
+			$result->sendErrJson();
+			return;
+		}
 
 		$this->beginTransaction();
 		$this->articleDao->saveArticle($article);
@@ -156,28 +159,31 @@ class ArticleController extends ControllerAdapter {
 	 * @return void
 	 */
 	function putDoArticle(int $articleId, ParamBody $body): void {
-		$articleObject = $this->articleDao->getArticleById($articleId);
-		if (empty($articleObject)) {
+		$article = $this->articleDao->getArticleById($articleId);
+		if (empty($article)) {
 			throw new PageNotFoundException('invalid article ID');
 		}
-		$article = $body->parseJson();
-		if (array_key_exists('title', $article) && !empty($article['title'])) {
-			$articleObject->setTitle((substr_replace($article['title'], "", 255)));
-		}
-		if (array_key_exists('text', $article) && !empty($article['text'])) {
-			$articleObject->setText($article['text']);
-		}
-		if (array_key_exists('categoryName', $article) && !empty($article['categoryName'])) {
-			if (!in_array($article['categoryName'], ['international', 'national', 'sport'])) {
-				throw new BadRequestException('invalid category name');
-			}
-			$articleObject->setCategoryName($article['categoryName']);
+
+		$httpData = $body->parseJsonToHttpData();
+
+		$result = $this->exec(Bind::attrs($httpData)->toObj($article)
+				->optProp('categoryName',
+						Validators::enum(['international', 'national', 'sport']),
+						Mappers::valueClosure(function ($categoryNameStr)  {
+							return CategoryName::tryFrom($categoryNameStr);
+						}))
+				->optProp('text', Mappers::cleanString(true, maxlength: 9999) )
+				->optProp('title', Mappers::cleanString(true, minlength: 3, maxlength: 255)));
+
+		if ($result->hasErrors()) {
+			$result->sendErrJson();
+			return;
 		}
 
 		$this->beginTransaction();
-		$this->articleDao->saveArticle($articleObject);
+		$this->articleDao->saveArticle($article);
 		$this->commit();
-		$this->sendJson($articleObject->jsonSerialize());
+		$this->sendJson($article->jsonSerialize());
 	}
 
 	/**

+ 1 - 2
src-php/app/internship/model/TagForm.php

@@ -14,7 +14,6 @@ class TagForm implements Dispatchable {
 	protected string $name;
 
 	public function __construct(NewsTag $tag = null) {
-		$this->name = '';
 		if ($tag) {
 			$this->name = $tag->getName();
 			$this->id = $tag->getId();
@@ -25,7 +24,7 @@ class TagForm implements Dispatchable {
 	/**
 	 * @return string
 	 */
-	public function getName() {
+	public function getName() : ?string {
 		return $this->name;
 	}
 	/**

+ 3 - 3
src-php/test/internship/controller/ArticleControllerTest.php

@@ -83,12 +83,12 @@ class ArticleControllerTest extends TestCase {
 	}
 
 	function testPostDoNewArticleBadCategory() {
-		$this->expectException(BadRequestException::class);
-		TestEnv::http()->newRequest()
+		$response = TestEnv::http()->newRequest()
 				->post(['api', 'newarticle'])
 				->bodyJson(['title' => 'Title 5', 'categoryName' => 'news', 'text' => 'Loren ipsum 5'])
 				->exec();
-
+		$articleStructs = $response->parseJson();
+		$this->assertEquals('ERR', $articleStructs['status']);
 	}
 	function testPostDoNewArticle() {
 		$response = TestEnv::http()->newRequest()