Skip to content

Commit 13d5520

Browse files
authored
1. Может быть кейс, что нужно подставить свой Upserter записей. Делаю его через DI.
2. Также условие `on conflict` для partial unique тоже пишется как `on conflict(id) where created_at is null` например. Что бы не переписывать весь Upserter и т.д., вынес резолвинг conflict condition'a в DI также.
1 parent 4e415f6 commit 13d5520

File tree

7 files changed

+77
-7
lines changed

7 files changed

+77
-7
lines changed

src/Integration/Laravel/Receive/Receiver.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
namespace Umbrellio\TableSync\Integration\Laravel\Receive;
66

7+
use Illuminate\Support\Facades\App;
78
use Umbrellio\TableSync\Integration\Laravel\Exceptions\UnknownMessageEvent;
89
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageDataRetriever;
10+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\Upserter;
911
use Umbrellio\TableSync\Messages\ReceivedMessage;
1012

1113
class Receiver
@@ -24,7 +26,7 @@ public function receive(ReceivedMessage $message): void
2426

2527
switch ($event) {
2628
case 'update':
27-
$upserter = new Upserter();
29+
$upserter = App::make(Upserter::class);
2830
$upserter->upsert($data, $message->getVersion());
2931
break;
3032
case 'destroy':
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Umbrellio\TableSync\Integration\Laravel\Receive\Upserter;
6+
7+
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageData;
8+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\ConflictConditionResolverContract;
9+
10+
class ByTargetKeysResolver implements ConflictConditionResolverContract
11+
{
12+
public function resolve(MessageData $messageData): string
13+
{
14+
return '(' . implode(',', $messageData->getTargetKeys()) . ')';
15+
}
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Umbrellio\TableSync\Integration\Laravel\Receive\Upserter;
6+
7+
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageData;
8+
9+
interface ConflictConditionResolverContract
10+
{
11+
public function resolve(MessageData $messageData): string;
12+
}

src/Integration/Laravel/Receive/Upserter.php renamed to src/Integration/Laravel/Receive/Upserter/Upserter.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@
22

33
declare(strict_types=1);
44

5-
namespace Umbrellio\TableSync\Integration\Laravel\Receive;
5+
namespace Umbrellio\TableSync\Integration\Laravel\Receive\Upserter;
66

77
use Illuminate\Support\Arr;
88
use Illuminate\Support\Facades\DB;
99
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageData;
10+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\ConflictConditionResolverContract;
1011

1112
class Upserter
1213
{
14+
private $conflictConditionResolver;
15+
16+
public function __construct(ConflictConditionResolverContract $conflictConditionResolver)
17+
{
18+
$this->conflictConditionResolver = $conflictConditionResolver;
19+
}
20+
1321
// todo via modern expressive not existing query builder
1422
public function upsert(MessageData $messageData, float $version): void
1523
{
@@ -25,7 +33,7 @@ public function upsert(MessageData $messageData, float $version): void
2533
}, $columns));
2634

2735
$values = $this->convertInsertValues($data);
28-
$target = implode(',', $messageData->getTargetKeys());
36+
$target = $this->conflictConditionResolver->resolve($messageData);
2937

3038
$valueBindings = Arr::flatten($data);
3139

@@ -34,7 +42,7 @@ public function upsert(MessageData $messageData, float $version): void
3442

3543
$sql = <<<CODE_SAMPLE
3644
INSERT INTO {$messageData->getTable()} ({$columnString}) VALUES {$values}
37-
ON CONFLICT ({$target})
45+
ON CONFLICT {$target}
3846
DO UPDATE
3947
SET {$updateSpecString}
4048
WHERE {$messageData->getTable()}.version < ?

src/Integration/Laravel/TableSyncServiceProvider.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
use Psr\Log\LoggerInterface;
1212
use Umbrellio\TableSync\Integration\Laravel\Console\PidManager;
1313
use Umbrellio\TableSync\Integration\Laravel\Publishers\QueuePublisher;
14+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\ByTargetKeysResolver;
1415
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageDataRetriever;
16+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\ConflictConditionResolverContract;
1517
use Umbrellio\TableSync\Integration\Laravel\ReceivedMessageHandlers\QueueReceivedMessageHandler;
1618
use Umbrellio\TableSync\Publisher;
1719
use Umbrellio\TableSync\Rabbit\ChannelContainer;
@@ -23,6 +25,7 @@
2325
class TableSyncServiceProvider extends ServiceProvider
2426
{
2527
protected $defer = true;
28+
public $bindings = [ConflictConditionResolverContract::class => ByTargetKeysResolver::class];
2629

2730
public function boot()
2831
{
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Umbrellio\TableSync\Tests\functional\Laravel\Integration\Receive\Upserter;
6+
7+
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageData;
8+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\ByTargetKeysResolver;
9+
use Umbrellio\TableSync\Tests\functional\Laravel\LaravelTestCase;
10+
11+
class ByTargetKeysResolverTest extends LaravelTestCase
12+
{
13+
/** @test */
14+
public function correctConditionResolved(): void
15+
{
16+
$resolver = new ByTargetKeysResolver();
17+
$messageData = new MessageData('test_models', ['id', 'name'], [
18+
[
19+
'id' => 1,
20+
'name' => 'new_name',
21+
],
22+
]);
23+
24+
$expectedCondition = '(id,name)';
25+
$this->assertSame($expectedCondition, $resolver->resolve($messageData));
26+
}
27+
}

tests/functional/Laravel/Integration/Receive/UpserterTest.php renamed to tests/functional/Laravel/Integration/Receive/Upserter/UpserterTest.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
declare(strict_types=1);
44

5-
namespace Umbrellio\TableSync\Tests\functional\Laravel\Integration\Receive;
5+
namespace Umbrellio\TableSync\Tests\functional\Laravel\Integration\Receive\Upserter;
66

77
use Umbrellio\TableSync\Integration\Laravel\Receive\MessageData\MessageData;
8-
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter;
8+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\ByTargetKeysResolver;
9+
use Umbrellio\TableSync\Integration\Laravel\Receive\Upserter\Upserter;
910
use Umbrellio\TableSync\Tests\functional\Laravel\LaravelTestCase;
1011
use Umbrellio\TableSync\Tests\functional\Laravel\Traits\StubPublisher;
1112

@@ -22,7 +23,8 @@ protected function setUp(): void
2223
{
2324
parent::setUp();
2425

25-
$this->upserter = new Upserter();
26+
$conflictResolver = new ByTargetKeysResolver();
27+
$this->upserter = new Upserter($conflictResolver);
2628

2729
$this->stubPublisher();
2830
}

0 commit comments

Comments
 (0)