feat(ckeditor5,board,ecommerce,page,core,admin_basic): 미참조 에디터 업로드 이미지 정리 신설 + 업로드 고아 동종 결함 7건 전수 해소
공개 (@Tuwasduliebst 제보) 대응. - ckeditor5: 미참조 이미지 정리 엔진 신설 — 참조 판정(hash + 파일명 2토큰, filter_reference_sources 훅으로 확장 콘텐츠 등록) + 정리 커맨드(기본 꺼짐 옵트인, 3중 게이트) + 업로드 관리 화면(권한 분리·참조 배지·개별/선택 삭제) + 기설치본 설정 백필 upgrade step - board: 임시 첨부 GC(상시) + 소프트삭제 첨부 영구 정리(옵트인) + 설정 UI, 저장 payload 누락(F4)·빈 temp 디렉토리 잔존(F5) 수정 - ecommerce: 임시 상품 이미지 GC + 카테고리 삭제 시 이미지 파일 미삭제(S4) 수정 - page: 임시 첨부 GC - 코어: 고아 첨부 정리 커맨드(옵트인, site_logo 보호) + 사이트 로고 교체 시 구 로고 재편입 차단(S6) + DB 백업 미구현 501 정직화(B3) + 플러그인 관리자 메뉴 설치·업데이트 자동 동기화(F1·F7) - 동반: 플러그인 설정 검증 오류 필드명 라벨화(F3), Toggle 노드 type 정정 수평 전개(marketing 1.0.2 bump·gdpr·ecommerce), ja 언어팩 4종, API 문서, hooks.md, 시나리오 매니페스트 8종, Playwright E2E 4종
This commit is contained in:
@@ -5,6 +5,7 @@ namespace App\Repositories;
|
||||
use App\Contracts\Repositories\AttachmentRepositoryInterface;
|
||||
use App\Models\Attachment;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
/**
|
||||
@@ -23,6 +24,17 @@ class AttachmentRepository implements AttachmentRepositoryInterface
|
||||
return Attachment::find($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 소프트삭제된 행까지 포함해 ID로 첨부파일 조회
|
||||
*
|
||||
* @param int $id 첨부파일 ID
|
||||
* @return Attachment|null 첨부파일 또는 null
|
||||
*/
|
||||
public function findByIdWithTrashed(int $id): ?Attachment
|
||||
{
|
||||
return Attachment::withTrashed()->find($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 여러 ID로 첨부파일 조회 (order 정렬)
|
||||
*
|
||||
@@ -283,4 +295,32 @@ class AttachmentRepository implements AttachmentRepositoryInterface
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자 없이 방치된 고아 첨부 후보를 오래된 순으로 조회합니다.
|
||||
*
|
||||
* @param Carbon $threshold 기준 시각
|
||||
* @param int $limit 최대 조회 건수
|
||||
* @param array<int, int> $protectedIds 보호할 첨부 ID 목록
|
||||
* @return Collection 고아 첨부 후보
|
||||
*/
|
||||
public function findOrphanCandidates(Carbon $threshold, int $limit, array $protectedIds = []): Collection
|
||||
{
|
||||
$query = Attachment::withTrashed()
|
||||
->whereNull('attachmentable_type')
|
||||
->whereNull('attachmentable_id')
|
||||
// 확장이 소유한 첨부는 그 확장의 라이프사이클 소관이므로 코어 GC 대상이 아니다.
|
||||
->whereNull('source_identifier')
|
||||
->where('created_at', '<', $threshold);
|
||||
|
||||
if ($protectedIds !== []) {
|
||||
$query->whereNotIn('id', $protectedIds);
|
||||
}
|
||||
|
||||
return $query
|
||||
->orderBy('created_at')
|
||||
->orderBy('id')
|
||||
->limit($limit)
|
||||
->get(['id', 'disk', 'path', 'collection', 'created_at']);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user