fix: возврат чужой работы, которую откатило моё сведение
Перед слиянием с main я откатил 4 файла к своей старой версии, чтобы
сдвинуть с места застрявшее слияние — и слияние закрепило этот откат.
Пострадала починка от 29.07: чтение связок поставщика из pivot (без неё
5 из 9 работающих проектов показывали жёлтое «Готовим к запуску» при
живом заказе) и два набора тестов вебхука/сверки CSV.
Файлы возвращены к состоянию main 7361d1ae3. На боевой откат НЕ уезжал —
выкат был точечный, только 6 файлов воронки продаж; проверено на живом
сервере: починка там на месте.
This commit is contained in:
@@ -7,8 +7,10 @@ use App\Models\SupplierLead;
|
||||
use App\Models\SystemSetting;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\Bus;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Tests\Concerns\SharesSupplierPdo;
|
||||
|
||||
uses(DatabaseTransactions::class);
|
||||
uses(DatabaseTransactions::class, SharesSupplierPdo::class);
|
||||
|
||||
beforeEach(function () {
|
||||
SystemSetting::query()->where('key', 'supplier_webhook_secret')->update(['value' => 'test-secret-32chars-aaaaaaaaaaaaaa']);
|
||||
@@ -159,3 +161,40 @@ it('accepts timestamp within ±24h window (Plan 2.6 fix #iii — partition guard
|
||||
|
||||
$response->assertStatus(202);
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Журнал вебхука поставщика (31.07.2026). Прежний logSupplierWebhook() писал в
|
||||
// таблицу webhook_log, снесённую ещё 24.05 вместе с legacy-каналом, и молча
|
||||
// выходил по Schema::hasTable → отказы были невидимы. Итог: 70 отказов 404 за
|
||||
// 10 дней (поставщик долбился со СТАРЫМ паролем на старый адрес) нашлись только
|
||||
// в логе nginx, случайно. Отпечаток пароля (первые 8 символов md5) отвечает на
|
||||
// главный вопрос разбора «это чужой ключ или наш» и сам секретом не является.
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
it('logs a rejected call with the secret fingerprint so a stale endpoint is visible', function () {
|
||||
$stale = 'stale-secret-32chars-bbbbbbbbbbbbbb';
|
||||
|
||||
$this->postJson("/api/webhook/supplier/{$stale}", [
|
||||
'vid' => 77001, 'project' => 'B1_test.ru', 'phone' => '79991234567', 'time' => time(),
|
||||
])->assertStatus(404);
|
||||
|
||||
$row = DB::connection('pgsql_supplier')->table('supplier_webhook_log')->latest('id')->first();
|
||||
expect($row)->not->toBeNull();
|
||||
expect($row->status)->toBe('rejected_secret');
|
||||
expect($row->secret_fingerprint)->toBe(substr(md5($stale), 0, 8));
|
||||
expect($row->supplier_lead_id)->toBeNull();
|
||||
});
|
||||
|
||||
it('logs an accepted call with the created lead id', function () {
|
||||
Bus::fake();
|
||||
$secret = 'test-secret-32chars-aaaaaaaaaaaaaa';
|
||||
|
||||
$this->postJson("/api/webhook/supplier/{$secret}", [
|
||||
'vid' => 77002, 'project' => 'B1_test.ru', 'phone' => '79991234568', 'time' => time(),
|
||||
])->assertStatus(202);
|
||||
|
||||
$row = DB::connection('pgsql_supplier')->table('supplier_webhook_log')->latest('id')->first();
|
||||
expect($row->status)->toBe('received');
|
||||
expect($row->secret_fingerprint)->toBe(substr(md5($secret), 0, 8));
|
||||
expect((int) $row->supplier_lead_id)->toBe((int) SupplierLead::where('vid', 77002)->value('id'));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user