fix(core,board,page,ecommerce,basic,pay): FULLTEXT 게이트·검색 실패 표면화와 페이지네이션/접두사 결함 정비

- 공개 : MATCH 는 커버 인덱스가 있을 때만 조립 — 부재 시 LIKE 폴백 + 1회 경고,
 카테고리 검색 예외를 categories_failed/search_failed 로 표면화하고 basic 템플릿이 오류 안내 렌더
- 공개 동근원: paginate page 명시 전달 (언어팩 check-updates, 상품 문의 목록)
- 공개 동근원: raw SQL 접두사/별칭 하드코딩 정리 (board 시더, 7.0.6 업그레이드 스텝,
 결제 3플러그인 컨트롤러 51지점 모델 파생 전환)
- audit 룰 3종 신설 + repository-raw-hardcoded-table 컨트롤러 확대, 확장 TestCase
 오토로더 중복 선언 가드 16지점, ja 언어팩 동기
This commit is contained in:
HeuJung
2026-08-17 03:02:26 +09:00
parent 3ccfb24417
commit 7f457a05b3
77 changed files with 2578 additions and 526 deletions
@@ -4,6 +4,7 @@ namespace App\Upgrades\Data\V7_0_6\Migrations;
use App\Extension\Upgrade\DataMigration;
use App\Extension\UpgradeContext;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
/**
@@ -20,20 +21,29 @@ use Illuminate\Support\Facades\Schema;
* 대기합니다. 새 색인을 먼저 만들고 기존 색인을 나중에 지우므로, 중간에 중단되어도 조회가
* 색인 없이 남는 구간은 없습니다.
*
* idempotent: 이미 교체된 대상은 건너뜁니다. V-1 안전: Facades\Schema 만 사용합니다.
* idempotent: 이미 교체된 대상은 건너뜁니다. V-1 안전: Facades\Schema / Facades\DB 만 사용합니다.
*/
class AddTiebreakToCoreListIndexes implements DataMigration
{
/**
* 대상 [테이블 => [신규 색인명, 컬럼, 교체 대상 기존 색인명(없으면 null)]]
* 대상을 반환합니다: [테이블 => [신규 색인명, 컬럼, 교체 대상 기존 색인명(없으면 null)]]
*
* @var array<string, array{0: string, 1: array<int, string>, 2: string|null}>
* activity_logs 의 기존 색인은 Laravel 자동 색인명(접두사 포함 테이블명에서 파생)이라
* 리터럴 `g7_` 을 박으면 다른 접두사 설치에서 조용한 no-op(중복 색인 잔존)이 된다 —
* `DB::getTablePrefix()` 로 동적 조립한다.
*
* @return array<string, array{0: string, 1: array<int, string>, 2: string|null}>
*/
private const TARGETS = [
'activity_logs' => ['idx_activity_logs_created_id', ['created_at', 'id'], 'g7_activity_logs_created_at_index'],
'notification_logs' => ['idx_notification_logs_created_id', ['created_at', 'id'], null],
'users' => ['idx_users_created_id', ['created_at', 'id'], 'idx_users_created_at'],
];
private function targets(): array
{
$prefix = DB::getTablePrefix();
return [
'activity_logs' => ['idx_activity_logs_created_id', ['created_at', 'id'], $prefix.'activity_logs_created_at_index'],
'notification_logs' => ['idx_notification_logs_created_id', ['created_at', 'id'], null],
'users' => ['idx_users_created_id', ['created_at', 'id'], 'idx_users_created_at'],
];
}
/**
* 마이그레이션 식별자를 반환합니다.
@@ -52,7 +62,7 @@ class AddTiebreakToCoreListIndexes implements DataMigration
*/
public function run(UpgradeContext $context): void
{
foreach (self::TARGETS as $table => [$newIndex, $columns, $oldIndex]) {
foreach ($this->targets() as $table => [$newIndex, $columns, $oldIndex]) {
if (! Schema::hasTable($table)) {
$context->logger->info("[core:7.0.6] 테이블 부재 — 색인 교체 스킵: {$table}");