Browse Source

Add IpAddress middleware for #519

Maurits van der Schee 6 years ago
parent
commit
d961897973
3 changed files with 128 additions and 3 deletions
  1. 61
    3
      api.php
  2. 4
    0
      src/Tqdev/PhpCrudApi/Api.php
  3. 63
    0
      src/Tqdev/PhpCrudApi/Middleware/IpAddressMiddleware.php

+ 61
- 3
api.php View File

@@ -2084,9 +2084,8 @@ class GenericDefinition
2084 2084
             case 'mysql':
2085 2085
                 return $column->getPk() ? ' AUTO_INCREMENT' : '';
2086 2086
             case 'pgsql':
2087
-                return '';
2088 2087
             case 'sqlsrv':
2089
-                return ($column->getPk() && !$update) ? ' IDENTITY(1,1)' : '';
2088
+                return '';
2090 2089
         }
2091 2090
     }
2092 2091
 
@@ -2278,15 +2277,17 @@ class GenericDefinition
2278 2277
         $fields = [];
2279 2278
         $constraints = [];
2280 2279
         foreach ($newTable->getColumnNames() as $columnName) {
2280
+            $pkColumn = $this->getPrimaryKey($tableName);
2281 2281
             $newColumn = $newTable->getColumn($columnName);
2282 2282
             $f1 = $this->quote($columnName);
2283 2283
             $f2 = $this->getColumnType($newColumn, false);
2284 2284
             $f3 = $this->quote($tableName . '_' . $columnName . '_fkey');
2285 2285
             $f4 = $this->quote($newColumn->getFk());
2286 2286
             $f5 = $this->quote($this->getPrimaryKey($newColumn->getFk()));
2287
+            $f6 = $this->quote($tableName . '_' . $pkColumn . '_pkey');
2287 2288
             $fields[] = "$f1 $f2";
2288 2289
             if ($newColumn->getPk()) {
2289
-                $constraints[] = "PRIMARY KEY ($f1)";
2290
+                $constraints[] = "CONSTRAINT $f6 PRIMARY KEY ($f1)";
2290 2291
             }
2291 2292
             if ($newColumn->getFk()) {
2292 2293
                 $constraints[] = "CONSTRAINT $f3 FOREIGN KEY ($f1) REFERENCES $f4 ($f5)";
@@ -3247,6 +3248,60 @@ class FirewallMiddleware extends Middleware
3247 3248
     }
3248 3249
 }
3249 3250
 
3251
+// file: src/Tqdev/PhpCrudApi/Middleware/IpAddressMiddleware.php
3252
+
3253
+class IpAddressMiddleware extends Middleware
3254
+{
3255
+    private $reflection;
3256
+
3257
+    public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
3258
+    {
3259
+        parent::__construct($router, $responder, $properties);
3260
+        $this->reflection = $reflection;
3261
+        $this->utils = new RequestUtils($reflection);
3262
+    }
3263
+
3264
+    private function callHandler($handler, $record, String $operation, ReflectedTable $table) /*: object */
3265
+    {
3266
+        $context = (array) $record;
3267
+        $columnName = $this->getProperty('column', '');
3268
+        if ($table->hasColumn($columnName)) {
3269
+            if ($operation == 'create') {
3270
+                $context[$columnName] = $_SERVER['REMOTE_ADDR'];
3271
+            } else {
3272
+                unset($context[$columnName]);
3273
+            }
3274
+        }
3275
+        return (object) $context;
3276
+    }
3277
+
3278
+    public function handle(Request $request): Response
3279
+    {
3280
+        $operation = $this->utils->getOperation($request);
3281
+        if (in_array($operation, ['create', 'update', 'increment'])) {
3282
+            $tableName = $request->getPathSegment(2);
3283
+            if ($this->reflection->hasTable($tableName)) {
3284
+                $record = $request->getBody();
3285
+                if ($record !== null) {
3286
+                    $handler = $this->getProperty('handler', '');
3287
+                    if ($handler !== '') {
3288
+                        $table = $this->reflection->getTable($tableName);
3289
+                        if (is_array($record)) {
3290
+                            foreach ($record as &$r) {
3291
+                                $r = $this->callHandler($handler, $r, $operation, $table);
3292
+                            }
3293
+                        } else {
3294
+                            $record = $this->callHandler($handler, $record, $operation, $table);
3295
+                        }
3296
+                        $request->setBody($record);
3297
+                    }
3298
+                }
3299
+            }
3300
+        }
3301
+        return $this->next->handle($request);
3302
+    }
3303
+}
3304
+
3250 3305
 // file: src/Tqdev/PhpCrudApi/Middleware/JoinLimitsMiddleware.php
3251 3306
 
3252 3307
 class JoinLimitsMiddleware extends Middleware
@@ -5287,6 +5342,9 @@ class Api
5287 5342
                 case 'validation':
5288 5343
                     new ValidationMiddleware($router, $responder, $properties, $reflection);
5289 5344
                     break;
5345
+                case 'ipAddress':
5346
+                    new IpAddressMiddleware($router, $responder, $properties);
5347
+                    break;
5290 5348
                 case 'sanitation':
5291 5349
                     new SanitationMiddleware($router, $responder, $properties, $reflection);
5292 5350
                     break;

+ 4
- 0
src/Tqdev/PhpCrudApi/Api.php View File

@@ -17,6 +17,7 @@ use Tqdev\PhpCrudApi\Middleware\CustomizationMiddleware;
17 17
 use Tqdev\PhpCrudApi\Middleware\FirewallMiddleware;
18 18
 use Tqdev\PhpCrudApi\Middleware\JoinLimitsMiddleware;
19 19
 use Tqdev\PhpCrudApi\Middleware\JwtAuthMiddleware;
20
+use Tqdev\PhpCrudApi\Middleware\IpAddressMiddleware;
20 21
 use Tqdev\PhpCrudApi\Middleware\MultiTenancyMiddleware;
21 22
 use Tqdev\PhpCrudApi\Middleware\PageLimitsMiddleware;
22 23
 use Tqdev\PhpCrudApi\Middleware\Router\SimpleRouter;
@@ -64,6 +65,9 @@ class Api
64 65
                 case 'validation':
65 66
                     new ValidationMiddleware($router, $responder, $properties, $reflection);
66 67
                     break;
68
+                case 'ipAddress':
69
+                    new IpAddressMiddleware($router, $responder, $properties);
70
+                    break;
67 71
                 case 'sanitation':
68 72
                     new SanitationMiddleware($router, $responder, $properties, $reflection);
69 73
                     break;

+ 63
- 0
src/Tqdev/PhpCrudApi/Middleware/IpAddressMiddleware.php View File

@@ -0,0 +1,63 @@
1
+<?php
2
+namespace Tqdev\PhpCrudApi\Middleware;
3
+
4
+use Tqdev\PhpCrudApi\Column\ReflectionService;
5
+use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
6
+use Tqdev\PhpCrudApi\Controller\Responder;
7
+use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
8
+use Tqdev\PhpCrudApi\Middleware\Router\Router;
9
+use Tqdev\PhpCrudApi\Record\RequestUtils;
10
+use Tqdev\PhpCrudApi\Request;
11
+use Tqdev\PhpCrudApi\Response;
12
+
13
+class IpAddressMiddleware extends Middleware
14
+{
15
+    private $reflection;
16
+
17
+    public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
18
+    {
19
+        parent::__construct($router, $responder, $properties);
20
+        $this->reflection = $reflection;
21
+        $this->utils = new RequestUtils($reflection);
22
+    }
23
+
24
+    private function callHandler($handler, $record, String $operation, ReflectedTable $table) /*: object */
25
+    {
26
+        $context = (array) $record;
27
+        $columnName = $this->getProperty('column', '');
28
+        if ($table->hasColumn($columnName)) {
29
+            if ($operation == 'create') {
30
+                $context[$columnName] = $_SERVER['REMOTE_ADDR'];
31
+            } else {
32
+                unset($context[$columnName]);
33
+            }
34
+        }
35
+        return (object) $context;
36
+    }
37
+
38
+    public function handle(Request $request): Response
39
+    {
40
+        $operation = $this->utils->getOperation($request);
41
+        if (in_array($operation, ['create', 'update', 'increment'])) {
42
+            $tableName = $request->getPathSegment(2);
43
+            if ($this->reflection->hasTable($tableName)) {
44
+                $record = $request->getBody();
45
+                if ($record !== null) {
46
+                    $handler = $this->getProperty('handler', '');
47
+                    if ($handler !== '') {
48
+                        $table = $this->reflection->getTable($tableName);
49
+                        if (is_array($record)) {
50
+                            foreach ($record as &$r) {
51
+                                $r = $this->callHandler($handler, $r, $operation, $table);
52
+                            }
53
+                        } else {
54
+                            $record = $this->callHandler($handler, $record, $operation, $table);
55
+                        }
56
+                        $request->setBody($record);
57
+                    }
58
+                }
59
+            }
60
+        }
61
+        return $this->next->handle($request);
62
+    }
63
+}

Loading…
Cancel
Save