Skip to content

Commit d295435

Browse files
committed
Make middleware more like react/http middleware
Where you nest them like an union.
1 parent bbee899 commit d295435

9 files changed

+35
-90
lines changed

src/Client.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
use PgAsync\Client as PgClient;
88
use Plasma\SQL\Grammar\PostgreSQL;
99
use Plasma\SQL\QueryBuilder;
10+
use React\Promise\PromiseInterface;
1011
use Rx\Observable;
1112
use WyriHaximus\React\SimpleORM\Middleware\ExecuteQueryMiddleware;
1213
use WyriHaximus\React\SimpleORM\Middleware\GrammarMiddleware;
1314
use function ApiClients\Tools\Rx\unwrapObservableFromPromise;
15+
use function React\Promise\resolve;
1416

1517
final class Client implements ClientInterface
1618
{
@@ -51,7 +53,6 @@ private function __construct(PgClient $client, Reader $annotationReader, Middlew
5153
$this->entityInspector = new EntityInspector($annotationReader);
5254

5355
$middleware[] = new GrammarMiddleware(new PostgreSQL());
54-
$middleware[] = new ExecuteQueryMiddleware($this->client);
5556

5657
$this->middlewareRunner = new MiddlewareRunner(...$middleware);
5758
}
@@ -67,6 +68,12 @@ public function getRepository(string $entity): RepositoryInterface
6768

6869
public function query(QueryBuilder $query): Observable
6970
{
70-
return unwrapObservableFromPromise($this->middlewareRunner->query($query));
71+
return unwrapObservableFromPromise($this->middlewareRunner->query(
72+
$query,
73+
function (QueryBuilder $query): PromiseInterface
74+
{
75+
return resolve($this->client->executeStatement($query->getQuery(), $query->getParameters()));
76+
}
77+
));
7178
}
7279
}

src/Middleware/ExecuteQueryMiddleware.php

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/Middleware/GrammarMiddleware.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public function __construct(GrammarInterface $grammer)
1818
$this->grammer = $grammer;
1919
}
2020

21-
public function query(QueryBuilder $query): PromiseInterface
21+
public function query(QueryBuilder $query, callable $next): PromiseInterface
2222
{
23-
return resolve($query->withGrammar($this->grammer));
23+
return resolve($next($query->withGrammar($this->grammer)));
2424
}
2525
}

src/Middleware/QueryCountMiddleware.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ final class QueryCountMiddleware implements MiddlewareInterface
1515
/** @var int */
1616
private $count = self::ZERO;
1717

18-
public function query(QueryBuilder $query): PromiseInterface
18+
public function query(QueryBuilder $query, callable $next): PromiseInterface
1919
{
2020
$this->count++;
2121

22-
return resolve($query);
22+
return resolve($next($query))->then();
2323
}
2424

2525
public function getCount(): int

src/MiddlewareInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ interface MiddlewareInterface
1111
* Returns the (modified) query through a promise.
1212
*
1313
* @param QueryBuilder $query
14+
* @param callable $next
1415
*
1516
* @return PromiseInterface
1617
*/
17-
public function query(QueryBuilder $query): PromiseInterface;
18+
public function query(QueryBuilder $query, callable $next): PromiseInterface;
1819
}

src/MiddlewareRunner.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
/**
1010
* @internal
1111
*/
12+
1213
final class MiddlewareRunner
1314
{
1415
/** @var MiddlewareInterface[] */
@@ -22,20 +23,20 @@ public function __construct(MiddlewareInterface ...$middleware)
2223
$this->middleware = $middleware;
2324
}
2425

25-
public function query(QueryBuilder $query): PromiseInterface
26+
public function query(QueryBuilder $query, callable $last): PromiseInterface
2627
{
27-
return $this->call($query, 0);
28+
return $this->call($query, 0, $last);
2829
}
2930

30-
private function call(QueryBuilder $query, int $position): PromiseInterface
31+
private function call(QueryBuilder $query, int $position, callable $last): PromiseInterface
3132
{
3233
// final request handler will be invoked without hooking into the promise
3334
if (!array_key_exists($position + 1, $this->middleware)) {
34-
return $this->middleware[$position]->query($query);
35+
return $this->middleware[$position]->query($query, $last);
3536
}
3637

37-
return $this->middleware[$position]->query($query)->then(function (QueryBuilder $query) use ($position) {
38-
return $this->call($query, $position + 1);
38+
return $this->middleware[$position]->query($query, function (QueryBuilder $query) use ($position, $last) {
39+
return $this->call($query, $position + 1, $last);
3940
});
4041
}
4142
}

tests/Middleware/ExecuteQueryMiddlewareTest.php

Lines changed: 0 additions & 49 deletions
This file was deleted.

tests/Middleware/GrammarMiddlewareTest.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
use Plasma\SQL\GrammarInterface;
66
use Plasma\SQL\QueryBuilder;
7+
use Rx\Observable;
8+
use Rx\ObservableInterface;
79
use WyriHaximus\AsyncTestUtilities\AsyncTestCase;
810
use WyriHaximus\React\SimpleORM\Middleware\GrammarMiddleware;
11+
use function ApiClients\Tools\Rx\observableFromArray;
912

1013
/**
1114
* @internal
@@ -20,8 +23,15 @@ public function testInsertedGrammar(): void
2023
$query = $this->prophesize(QueryBuilder::class);
2124
$query->withGrammar($grammar->reveal())->shouldBeCalled()->willReturn($query->reveal());
2225

23-
$queryWithGrammar = $this->await($middleware->query($query->reveal()));
26+
$nextCount = false;
27+
$observable = $this->await($middleware->query($query->reveal(), function () use (&$nextCount) {
28+
$nextCount = true;
2429

25-
self::assertSame($query->reveal(), $queryWithGrammar);
30+
return observableFromArray([]);
31+
}));
32+
33+
self::assertTrue($nextCount);
34+
self::assertInstanceOf(ObservableInterface::class, $observable);
35+
self::assertInstanceOf(Observable::class, $observable);
2636
}
2737
}

tests/Middleware/QueryCountMiddlewareTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function testCounting(): void
2222

2323
self::assertSame(0, $middleware->getCount());
2424

25-
$middleware->query(QueryBuilder::create());
25+
$middleware->query(QueryBuilder::create(), function () {});
2626

2727
self::assertSame(1, $middleware->getCount());
2828

0 commit comments

Comments
 (0)