Skip to content

Commit f85ca00

Browse files
authored
Merge pull request #78 from utopia-php/feat-param-aliases
Feat: Param aliases
2 parents 87a5616 + c0da80a commit f85ca00

9 files changed

Lines changed: 192 additions & 99 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"php": ">=8.3",
3030
"php-amqplib/php-amqplib": "^3.7",
3131
"utopia-php/di": "0.3.*",
32-
"utopia-php/servers": "0.3.*",
32+
"utopia-php/servers": "0.4.0",
3333
"utopia-php/pools": "1.*",
3434
"utopia-php/telemetry": "0.2.*",
3535
"utopia-php/validators": "0.2.*"

composer.lock

Lines changed: 89 additions & 92 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Queue/Server.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,18 @@ protected function getArguments(Container $container, Hook $hook, array $payload
396396
{
397397
$arguments = [];
398398
foreach ($hook->getParams() as $key => $param) {
399+
$payloadKey = $key;
400+
if (!\array_key_exists($key, $payload) && !empty($param['aliases'])) {
401+
foreach ($param['aliases'] as $alias) {
402+
if (\array_key_exists($alias, $payload)) {
403+
$payloadKey = $alias;
404+
break;
405+
}
406+
}
407+
}
408+
399409
// Get value from route or request object
400-
$value = $payload[$key] ?? $param['default'];
410+
$value = $payload[$payloadKey] ?? $param['default'];
401411
$value =
402412
$value === '' || $value === null ? $param['default'] : $value;
403413

tests/Queue/E2E/Adapter/Base.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,43 @@ public function testEnqueuePriority(): void
9595
$this->assertTrue($result);
9696
}
9797

98+
public function testParamAliases(): void
99+
{
100+
$publisher = $this->getPublisher();
101+
102+
// Resolves via canonical key
103+
$this->assertTrue($publisher->enqueue($this->getQueue(), [
104+
'type' => 'test_alias',
105+
'aliasValue' => 'canonical',
106+
'value' => 'canonical',
107+
]));
108+
109+
// Resolves via first alias when canonical absent
110+
$this->assertTrue($publisher->enqueue($this->getQueue(), [
111+
'type' => 'test_alias',
112+
'alias_value' => 'first-alias',
113+
'value' => 'first-alias',
114+
]));
115+
116+
// Falls through to later alias when earlier ones absent
117+
$this->assertTrue($publisher->enqueue($this->getQueue(), [
118+
'type' => 'test_alias',
119+
'aliased' => 'second-alias',
120+
'value' => 'second-alias',
121+
]));
122+
123+
// Canonical key wins when both canonical and aliases are present
124+
$this->assertTrue($publisher->enqueue($this->getQueue(), [
125+
'type' => 'test_alias',
126+
'aliasValue' => 'canonical-wins',
127+
'alias_value' => 'should-lose',
128+
'aliased' => 'should-lose',
129+
'value' => 'canonical-wins',
130+
]));
131+
132+
sleep(1);
133+
}
134+
98135
/**
99136
* @depends testEvents
100137
*/

tests/Queue/servers/AMQP/worker.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,23 @@
66
use Utopia\Queue\Broker\AMQP;
77
use Utopia\Queue\Adapter\Swoole;
88
use Utopia\Queue\Server;
9+
use Utopia\Validator\Text;
910

1011
$consumer = new AMQP(host: 'amqp', port: 5672, user: 'amqp', password: 'amqp');
1112
$adapter = new Swoole($consumer, 12, 'amqp');
1213
$server = new Server($adapter);
1314

14-
$server->job()->inject('message')->action(handleRequest(...));
15+
$server->job()
16+
->inject('message')
17+
->param(
18+
key: 'aliasValue',
19+
default: '',
20+
validator: new Text(length: 255, min: 0),
21+
description: 'alias resolution test value',
22+
optional: true,
23+
aliases: ['alias_value', 'aliased'],
24+
)
25+
->action(handleRequest(...));
1526

1627
$server
1728
->error()

tests/Queue/servers/Swoole/worker.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,23 @@
77
use Utopia\Queue\Adapter\Swoole;
88
use Utopia\Queue\Connection\Redis as RedisConnection;
99
use Utopia\Queue\Broker\Redis;
10+
use Utopia\Validator\Text;
1011

1112
$consumer = new Redis(new RedisConnection('redis'));
1213
$adapter = new Swoole($consumer, 12, 'swoole');
1314
$server = new Server($adapter);
1415

15-
$server->job()->inject('message')->action(handleRequest(...));
16+
$server->job()
17+
->inject('message')
18+
->param(
19+
key: 'aliasValue',
20+
default: '',
21+
validator: new Text(length: 255, min: 0),
22+
description: 'alias resolution test value',
23+
optional: true,
24+
aliases: ['alias_value', 'aliased'],
25+
)
26+
->action(handleRequest(...));
1627

1728
$server
1829
->error()

tests/Queue/servers/SwooleRedisCluster/worker.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Utopia\Queue\Connection\RedisCluster;
88
use Utopia\Queue\Adapter\Swoole;
99
use Utopia\Queue\Server;
10+
use Utopia\Validator\Text;
1011

1112
$consumer = new Redis(
1213
new RedisCluster([
@@ -18,7 +19,17 @@
1819
$adapter = new Swoole($consumer, 12, 'swoole-redis-cluster');
1920
$server = new Server($adapter);
2021

21-
$server->job()->inject('message')->action(handleRequest(...));
22+
$server->job()
23+
->inject('message')
24+
->param(
25+
key: 'aliasValue',
26+
default: '',
27+
validator: new Text(length: 255, min: 0),
28+
description: 'alias resolution test value',
29+
optional: true,
30+
aliases: ['alias_value', 'aliased'],
31+
)
32+
->action(handleRequest(...));
2233

2334
$server
2435
->error()

tests/Queue/servers/Workerman/worker.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,23 @@
77
use Utopia\Queue\Adapter\Workerman;
88
use Utopia\Queue\Connection\Redis as RedisConnection;
99
use Utopia\Queue\Broker\Redis;
10+
use Utopia\Validator\Text;
1011

1112
$consumer = new Redis(new RedisConnection('redis'));
1213
$adapter = new Workerman($consumer, 12, 'wokerman');
1314
$server = new Queue\Server($adapter);
1415

15-
$server->job()->inject('message')->action(handleRequest(...));
16+
$server->job()
17+
->inject('message')
18+
->param(
19+
key: 'aliasValue',
20+
default: '',
21+
validator: new Text(length: 255, min: 0),
22+
description: 'alias resolution test value',
23+
optional: true,
24+
aliases: ['alias_value', 'aliased'],
25+
)
26+
->action(handleRequest(...));
1627

1728
$server
1829
->error()

tests/Queue/servers/tests.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
use Utopia\Queue;
44

5-
function handleRequest(Queue\Message $job): void
5+
function handleRequest(Queue\Message $job, ?string $aliasValue = null): void
66
{
77
$type = $job->getPayload()['type'];
88
$value = $job->getPayload()['value'] ?? null;
@@ -38,6 +38,11 @@ function handleRequest(Queue\Message $job): void
3838
assert($value['bool'] === true);
3939
assert($value['null'] === null);
4040

41+
break;
42+
case 'test_alias':
43+
// payload's `value` field carries the expected resolved alias value
44+
assert($aliasValue === $value);
45+
4146
break;
4247
case 'test_exception':
4348
assert(false);

0 commit comments

Comments
 (0)