feat(seo): 사이트맵 재생성 알림·폴링 폴백 + 코어 7.0.6 확정

이슈 후속(S7) 마감 + 릴리스 버전 확정.

기능(S7):
- 사이트맵 전체 재생성 완료/실패 시 실행 관리자에게 알림(수동 실행 한정).
 스케줄러·증분·봇 재생성은 알림 없음(triggered_by 부재 시 skip).
- 최종 실패 전용 알림 + 재생성 전용 큐 + WS 진행상황 payload 봉투 정정.
- Reverb OFF 폴링 폴백 경로 수정(실브라우저 폴링에서만 드러난 결함).

버전(D28 — 정정, D20 번복):
- 릴리스를 7.0.5→7.0.6(patch)로 확정. 7.1.0(minor)은 다른 브랜치에서 별도 진행.
- config/app.php + .env + README + INSTALL + CHANGELOG + 모듈 3 requires 를 7.0.6 로.
- D19 SEO 캐시 이행 업그레이드 스텝을 Upgrade_7_0_6 로 리네임.
 이유: 스텝 버전 게이팅이 version<=toVersion 이라, 7.1.0 이름이면
 7.0.5→7.0.6 업그레이드에서 이행이 실행되지 않는다.

검증: composer test-smoke OK(2·29) · 재생성 알림/업그레이드 이행/진행상황 테스트 green ·
version-sync/version-bump(new-bump)/extension-require green · audit 0 error.
This commit is contained in:
HeuJung committed 2026-07-19 18:57:51 +09:00
1 parent 3dd34104cc
commit 124433148c
35 files changed
+698 -53

No files matched your search

+25 -2
View File
@@ -121,10 +121,33 @@ class SitemapProgressTest extends TestCase
$this->progress->start('full');
Event::assertDispatched(GenericBroadcastEvent::class, function ($event) {
// payload 는 상태 API 봉투와 동형: 최상위 data 안에 progress/realtime_enabled
// (target_source 가 대상 소스를 통째 교체해도 `sitemap_status.data.*` 바인딩 유지)
return $event->channel === 'core.admin.seo.sitemap'
&& $event->eventName === 'sitemap.progress.updated'
&& ($event->payload['realtime_enabled'] ?? null) === true
&& ($event->payload['progress']['status'] ?? null) === 'queued';
&& ($event->payload['data']['realtime_enabled'] ?? null) === true
&& ($event->payload['data']['progress']['status'] ?? null) === 'queued'
&& array_key_exists('last_updated_at', $event->payload['data']);
});
}
/**
* 완료 방송은 방금 커밋된 생성 시각을 data.last_updated_at 으로 실어 "마지막 생성"을 실시간 갱신한다.
*/
public function test_complete_broadcast_carries_new_last_updated_at(): void
{
$this->enableReverb();
Event::fake([GenericBroadcastEvent::class]);
$this->progress->complete([
'url_count' => 720,
'child_count' => 1,
'generated_at' => '2026-07-19T00:00:00+00:00',
]);
Event::assertDispatched(GenericBroadcastEvent::class, function ($event) {
return ($event->payload['data']['last_updated_at'] ?? null) === '2026-07-19T00:00:00+00:00'
&& ($event->payload['data']['progress']['status'] ?? null) === 'completed';
});
}