Browse Source

post MR fixes; add HttpCodeEnum and fix return codes

Olivier Massot 1 year ago
parent
commit
571cc0322a

File diff suppressed because it is too large
+ 0 - 0
icon.svg


+ 139 - 0
src/Enum/Utils/HttpCodeEnum.php

@@ -0,0 +1,139 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum\Utils;
+
+use MyCLabs\Enum\Enum;
+
+/**
+ * Enums for HTTP status codes.
+ *
+ * @method static int CONTINUE() Returns status code: 100
+ * @method static int SWITCHING_PROTOCOLS() Returns status code: 101
+ * @method static int PROCESSING() Returns status code: 102
+ * @method static int EARLY_HINTS() Returns status code: 103
+ * @method static int OK() Returns status code: 200
+ * @method static int CREATED() Returns status code: 201
+ * @method static int ACCEPTED() Returns status code: 202
+ * @method static int NON_AUTHORITATIVE_INFORMATION() Returns status code: 203
+ * @method static int NO_CONTENT() Returns status code: 204
+ * @method static int RESET_CONTENT() Returns status code: 205
+ * @method static int PARTIAL_CONTENT() Returns status code: 206
+ * @method static int MULTI_STATUS() Returns status code: 207
+ * @method static int ALREADY_REPORTED() Returns status code: 208
+ * @method static int IM_USED() Returns status code: 226
+ * @method static int MULTIPLE_CHOICES() Returns status code: 300
+ * @method static int MOVED_PERMANENTLY() Returns status code: 301
+ * @method static int FOUND() Returns status code: 302
+ * @method static int SEE_OTHER() Returns status code: 303
+ * @method static int NOT_MODIFIED() Returns status code: 304
+ * @method static int USE_PROXY() Returns status code: 305
+ * @method static int RESERVED() Returns status code: 306
+ * @method static int TEMPORARY_REDIRECT() Returns status code: 307
+ * @method static int PERMANENTLY_REDIRECT() Returns status code: 308
+ * @method static int BAD_REQUEST() Returns status code: 400
+ * @method static int UNAUTHORIZED() Returns status code: 401
+ * @method static int PAYMENT_REQUIRED() Returns status code: 402
+ * @method static int FORBIDDEN() Returns status code: 403
+ * @method static int NOT_FOUND() Returns status code: 404
+ * @method static int METHOD_NOT_ALLOWED() Returns status code: 405
+ * @method static int NOT_ACCEPTABLE() Returns status code: 406
+ * @method static int PROXY_AUTHENTICATION_REQUIRED() Returns status code: 407
+ * @method static int REQUEST_TIMEOUT() Returns status code: 408
+ * @method static int CONFLICT() Returns status code: 409
+ * @method static int GONE() Returns status code: 410
+ * @method static int LENGTH_REQUIRED() Returns status code: 411
+ * @method static int PRECONDITION_FAILED() Returns status code: 412
+ * @method static int REQUEST_ENTITY_TOO_LARGE() Returns status code: 413
+ * @method static int REQUEST_URI_TOO_LONG() Returns status code: 414
+ * @method static int UNSUPPORTED_MEDIA_TYPE() Returns status code: 415
+ * @method static int REQUESTED_RANGE_NOT_SATISFIABLE() Returns status code: 416
+ * @method static int EXPECTATION_FAILED() Returns status code: 417
+ * @method static int MISDIRECTED_REQUEST() Returns status code: 421
+ * @method static int UNPROCESSABLE_ENTITY() Returns status code: 422
+ * @method static int LOCKED() Returns status code: 423
+ * @method static int FAILED_DEPENDENCY() Returns status code: 424
+ * @method static int TOO_EARLY() Returns status code: 425
+ * @method static int UPGRADE_REQUIRED() Returns status code: 426
+ * @method static int PRECONDITION_REQUIRED() Returns status code: 428
+ * @method static int TOO_MANY_REQUESTS() Returns status code: 429
+ * @method static int REQUEST_HEADER_FIELDS_TOO_LARGE() Returns status code: 431
+ * @method static int UNAVAILABLE_FOR_LEGAL_REASONS() Returns status code: 451
+ * @method static int INTERNAL_SERVER_ERROR() Returns status code: 500
+ * @method static int NOT_IMPLEMENTED() Returns status code: 501
+ * @method static int BAD_GATEWAY() Returns status code: 502
+ * @method static int SERVICE_UNAVAILABLE() Returns status code: 503
+ * @method static int GATEWAY_TIMEOUT() Returns status code: 504
+ * @method static int VERSION_NOT_SUPPORTED() Returns status code: 505
+ * @method static int VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL() Returns status code: 506
+ * @method static int INSUFFICIENT_STORAGE() Returns status code: 507
+ * @method static int LOOP_DETECTED() Returns status code: 508
+ * @method static int NOT_EXTENDED() Returns status code: 510
+ * @method static int NETWORK_AUTHENTICATION_REQUIRED() Returns status code: 511
+ */
+class HttpCodeEnum extends Enum
+{
+    private const CONTINUE = 100;
+    private const SWITCHING_PROTOCOLS = 101;
+    private const PROCESSING = 102;            // RFC2518
+    private const EARLY_HINTS = 103;           // RFC8297
+    private const OK = 200;
+    private const CREATED = 201;
+    private const ACCEPTED = 202;
+    private const NON_AUTHORITATIVE_INFORMATION = 203;
+    private const NO_CONTENT = 204;
+    private const RESET_CONTENT = 205;
+    private const PARTIAL_CONTENT = 206;
+    private const MULTI_STATUS = 207;          // RFC4918
+    private const ALREADY_REPORTED = 208;      // RFC5842
+    private const IM_USED = 226;               // RFC3229
+    private const MULTIPLE_CHOICES = 300;
+    private const MOVED_PERMANENTLY = 301;
+    private const FOUND = 302;
+    private const SEE_OTHER = 303;
+    private const NOT_MODIFIED = 304;
+    private const USE_PROXY = 305;
+    private const RESERVED = 306;
+    private const TEMPORARY_REDIRECT = 307;
+    private const PERMANENTLY_REDIRECT = 308;  // RFC7238
+    private const BAD_REQUEST = 400;
+    private const UNAUTHORIZED = 401;
+    private const PAYMENT_REQUIRED = 402;
+    private const FORBIDDEN = 403;
+    private const NOT_FOUND = 404;
+    private const METHOD_NOT_ALLOWED = 405;
+    private const NOT_ACCEPTABLE = 406;
+    private const PROXY_AUTHENTICATION_REQUIRED = 407;
+    private const REQUEST_TIMEOUT = 408;
+    private const CONFLICT = 409;
+    private const GONE = 410;
+    private const LENGTH_REQUIRED = 411;
+    private const PRECONDITION_FAILED = 412;
+    private const REQUEST_ENTITY_TOO_LARGE = 413;
+    private const REQUEST_URI_TOO_LONG = 414;
+    private const UNSUPPORTED_MEDIA_TYPE = 415;
+    private const REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+    private const EXPECTATION_FAILED = 417;
+    private const I_AM_A_TEAPOT = 418;                                               // RFC2324
+    private const MISDIRECTED_REQUEST = 421;                                         // RFC7540
+    private const UNPROCESSABLE_ENTITY = 422;                                        // RFC4918
+    private const LOCKED = 423;                                                      // RFC4918
+    private const FAILED_DEPENDENCY = 424;                                           // RFC4918
+    private const TOO_EARLY = 425;                                                   // RFC-ietf-httpbis-replay-04
+    private const UPGRADE_REQUIRED = 426;                                            // RFC2817
+    private const PRECONDITION_REQUIRED = 428;                                       // RFC6585
+    private const TOO_MANY_REQUESTS = 429;                                           // RFC6585
+    private const REQUEST_HEADER_FIELDS_TOO_LARGE = 431;                             // RFC6585
+    private const UNAVAILABLE_FOR_LEGAL_REASONS = 451;                               // RFC7725
+    private const INTERNAL_SERVER_ERROR = 500;
+    private const NOT_IMPLEMENTED = 501;
+    private const BAD_GATEWAY = 502;
+    private const SERVICE_UNAVAILABLE = 503;
+    private const GATEWAY_TIMEOUT = 504;
+    private const VERSION_NOT_SUPPORTED = 505;
+    private const VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506;                        // RFC2295
+    private const INSUFFICIENT_STORAGE = 507;                                        // RFC4918
+    private const LOOP_DETECTED = 508;                                               // RFC5842
+    private const NOT_EXTENDED = 510;                                                // RFC2774
+    private const NETWORK_AUTHENTICATION_REQUIRED = 511;                             // RFC6585
+}

+ 0 - 1
src/Service/Access/AdminAccessUtils.php

@@ -42,7 +42,6 @@ class AdminAccessUtils
             ->setOrganizationId($organization->getId())
             ->setUsername($administrator->getPerson()->getUserIdentifier())
             ->setEmail($contactPoint->getEmail())
-            ->setOrganizationId($organization->getId())
         ;
         return $adminAccess;
     }

+ 3 - 2
src/State/Processor/Access/AdminAccessProcessor.php

@@ -6,6 +6,7 @@ namespace App\State\Processor\Access;
 use ApiPlatform\Metadata\Delete;
 use ApiPlatform\State\ProcessorInterface;
 use App\Entity\Access\Access;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\Access\Utils as AccessUtils;
 use App\Service\Core\ContactPointUtils;
 use Doctrine\ORM\EntityManagerInterface;
@@ -36,7 +37,7 @@ class AdminAccessProcessor implements ProcessorInterface
     public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): void
     {
         if($operation instanceof Delete){
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         /** @var Access $access */
@@ -56,4 +57,4 @@ class AdminAccessProcessor implements ProcessorInterface
         $this->entityManager->persist($contactPoint);
         $this->entityManager->flush();
     }
-}
+}

+ 4 - 3
src/State/Processor/Core/UploadRequestProcessor.php

@@ -13,6 +13,7 @@ use App\ApiResources\Core\File\UploadRequest;
 use App\Entity\Access\Access;
 use App\Enum\Core\FileStatusEnum;
 use App\Enum\Core\FileTypeEnum;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Repository\Core\FileRepository;
 use App\Service\File\Exception\FileNotFoundException;
 use App\Service\File\FileManager;
@@ -42,7 +43,7 @@ final class UploadRequestProcessor implements ProcessorInterface
     public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): UploadRequest
     {
         if ($operation instanceof Delete){
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         /** @var Access $author */
@@ -52,10 +53,10 @@ final class UploadRequestProcessor implements ProcessorInterface
         $uploadRequest = $data;
 
         if (empty($uploadRequest->getFilename())) {
-            throw new \RuntimeException("Missing filename", 400);
+            throw new \RuntimeException("Missing filename", HttpCodeEnum::BAD_REQUEST()->getValue());
         }
         if (empty($uploadRequest->getContent())) {
-            throw new \RuntimeException("Provided content is empty", 400);
+            throw new \RuntimeException("Provided content is empty", HttpCodeEnum::BAD_REQUEST()->getValue());
         }
 
         $file = $this->fileManager->makeFile(

+ 2 - 1
src/State/Processor/EntityProcessor.php

@@ -5,6 +5,7 @@ namespace App\State\Processor;
 use ApiPlatform\Metadata\Delete;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProcessorInterface;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\OnChange\OnChangeContext;
 use App\Service\OnChange\OnChangeDefault;
 use App\Service\OnChange\OnChangeInterface;
@@ -42,7 +43,7 @@ class EntityProcessor implements ProcessorInterface
     public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): object
     {
         if($operation instanceof Delete){
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         $onChangeContext = new OnChangeContext($context);

+ 2 - 1
src/State/Processor/Export/LicenceCmf/ExportRequestProcessor.php

@@ -9,6 +9,7 @@ use ApiPlatform\State\ProcessorInterface;
 use App\ApiResources\Export\ExportRequest;
 use App\Entity\Access\Access;
 use App\Entity\Core\File;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Message\Command\Export;
 use App\Service\ServiceIterator\ExporterIterator;
 use Exception;
@@ -35,7 +36,7 @@ class ExportRequestProcessor implements ProcessorInterface
     public function process(mixed $exportRequest, Operation $operation, array $uriVariables = [], array $context = []): ExportRequest
     {
         if($operation instanceof Delete){
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         /** @var Access $access */

+ 4 - 3
src/State/Processor/Organization/SubdomainProcessor.php

@@ -10,6 +10,7 @@ use ApiPlatform\Metadata\Put;
 use ApiPlatform\State\ProcessorInterface;
 use App\Entity\Access\Access;
 use App\Entity\Organization\Subdomain;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Repository\Organization\SubdomainRepository;
 use App\Service\Typo3\SubdomainService;
 use Doctrine\ORM\EntityManagerInterface;
@@ -36,7 +37,7 @@ class SubdomainProcessor implements ProcessorInterface
      */
     public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []) {
         if($operation instanceof Delete){
-            throw new \RuntimeException('not supported', 500);
+            throw new \RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         /** @var Access $access */
@@ -44,7 +45,7 @@ class SubdomainProcessor implements ProcessorInterface
 
         if ($data->getOrganization()->getId() !== $access->getOrganization()->getId()) {
             // TODO: voir à déplacer dans un voter?
-            throw new \RuntimeException('forbidden', 500);
+            throw new \RuntimeException('forbidden', HttpCodeEnum::FORBIDDEN()->getValue());
         }
 
         if ($operation instanceof Post) {
@@ -59,7 +60,7 @@ class SubdomainProcessor implements ProcessorInterface
             $data->setActive(false); // On triche : c'est le service qui va activer ce sous-domaine, pas le processor
             $subdomain = $this->subdomainService->activateSubdomain($data);
         } else {
-            throw new \RuntimeException('not supported', 500);
+            throw new \RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         return $subdomain;

+ 3 - 2
src/State/Provider/Access/AccessProfileProvider.php

@@ -9,6 +9,7 @@ use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Profile\AccessProfile;
 use App\Entity\Access\Access;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\Access\AccessProfileCreator;
 use Exception;
 use RuntimeException;
@@ -37,7 +38,7 @@ final class AccessProfileProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?AccessProfile
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         /** @var Access $access */
@@ -53,4 +54,4 @@ final class AccessProfileProvider implements ProviderInterface
 
         return $this->accessProfileCreator->getAccessProfile($access, $originalAccess);
     }
-}
+}

+ 3 - 2
src/State/Provider/Access/AdminAccessProvider.php

@@ -9,6 +9,7 @@ use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Access\AdminAccess;
 use App\Entity\Access\Access;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\Access\AdminAccessUtils;
 use Exception;
 use RuntimeException;
@@ -36,11 +37,11 @@ final class AdminAccessProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?AdminAccess
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         /** @var Access $access */
         $access = $this->security->getUser();
         return $this->adminAccessUtils->getAdminAccess($access->getOrganization());
     }
-}
+}

+ 2 - 1
src/State/Provider/Core/DownloadRequestProvider.php

@@ -8,6 +8,7 @@ use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Core\File\DownloadRequest;
 use App\Enum\Core\FileStatusEnum;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Repository\Core\FileRepository;
 use App\Service\File\Exception\FileNotFoundException;
 use App\Service\File\FileManager;
@@ -36,7 +37,7 @@ final class DownloadRequestProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): Response | RedirectResponse
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         return $this->serveFile($uriVariables['fileId']);

+ 2 - 1
src/State/Provider/Cotisation/CotisationProvider.php

@@ -8,6 +8,7 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Cotisation\Cotisation;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\Cotisation\CotisationCreator;
 use RuntimeException;
 
@@ -29,7 +30,7 @@ final class CotisationProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?Cotisation
     {
         if ($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         return $this->cotisationCreator->getCotisation($uriVariables['organizationId']);

+ 2 - 1
src/State/Provider/Dolibarr/DolibarrAccountProvider.php

@@ -7,6 +7,7 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Dolibarr\DolibarrAccount;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\ApiResourceBuilder\Dolibarr\DolibarrAccountBuilder;
 use RuntimeException;
 
@@ -31,7 +32,7 @@ final class DolibarrAccountProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?DolibarrAccount
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         return $this->dolibarrAccountCreator->getDolibarrAccount($uriVariables['organizationId']);

+ 2 - 1
src/State/Provider/Enum/EnumProvider.php

@@ -7,6 +7,7 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Enum\Enum;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\Utils\Parser\YamlParser;
 use App\Service\Utils\Reflection;
 use Exception;
@@ -35,7 +36,7 @@ final class EnumProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?Enum
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         $id = $uriVariables['name'];

+ 2 - 1
src/State/Provider/Mobyt/MobytUserStatusProvider.php

@@ -7,6 +7,7 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Mobyt\MobytUserStatus;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\ApiResourceBuilder\Mobyt\MobytUserStatusBuilder;
 use JsonException;
 use RuntimeException;
@@ -32,7 +33,7 @@ final class MobytUserStatusProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?MobytUserStatus
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         return $this->mobytUserStatusCreator->getUserStatus((int) $uriVariables['organizationId']);

+ 3 - 2
src/State/Provider/Organization/Subdomain/SubdomainAvailabilityProvider.php

@@ -6,6 +6,7 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Organization\Subdomain\SubdomainAvailability;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\File\Exception\FileNotFoundException;
 use App\Service\Typo3\SubdomainService;
 use Symfony\Component\HttpFoundation\RedirectResponse;
@@ -30,13 +31,13 @@ final class SubdomainAvailabilityProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?SubdomainAvailability
     {
         if ($operation instanceof GetCollection) {
-            throw new \RuntimeException('not supported', 500);
+            throw new \RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         $filters = $context['filters'] ?? [];
         $subdomain = $filters['subdomain'] ?? null;
         if ($subdomain === null) {
-            throw new \RuntimeException('missing parameter: subdomain', 500);
+            throw new \RuntimeException('missing parameter: subdomain', HttpCodeEnum::BAD_REQUEST()->getValue());
         }
 
         $available =

+ 2 - 1
src/State/Provider/Utils/SiretProvider.php

@@ -7,6 +7,7 @@ use ApiPlatform\Metadata\GetCollection;
 use ApiPlatform\Metadata\Operation;
 use ApiPlatform\State\ProviderInterface;
 use App\ApiResources\Utils\Siret;
+use App\Enum\Utils\HttpCodeEnum;
 use App\Service\Utils\Siret as SiretUtils;
 use RuntimeException;
 use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
@@ -38,7 +39,7 @@ final class SiretProvider implements ProviderInterface
     public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?Siret
     {
         if($operation instanceof GetCollection) {
-            throw new RuntimeException('not supported', 500);
+            throw new RuntimeException('not supported', HttpCodeEnum::METHOD_NOT_ALLOWED()->getValue());
         }
 
         $id = $uriVariables['id'];

Some files were not shown because too many files changed in this diff