feat: add checks to prevent duplicate report entries and extract clean title and link from legacy reports
This commit is contained in:
parent
a30cfb28a5
commit
7bf5775ad9
@ -381,6 +381,16 @@ private function processReport(object $legacyReport, int $cooperationId, int $ta
|
|||||||
|
|
||||||
[$cleanTitle, $cleanLink] = $this->extractLinkData($legacyReport);
|
[$cleanTitle, $cleanLink] = $this->extractLinkData($legacyReport);
|
||||||
|
|
||||||
|
$exists = DB::table('reports')
|
||||||
|
->where('media_task_assignment_id', $mediaTaskAssignment->id)
|
||||||
|
->where('publication_date', $legacyReport->broadcast)
|
||||||
|
->where('link', $cleanLink)
|
||||||
|
->exists();
|
||||||
|
|
||||||
|
if ($exists) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DB::table('reports')->insert([
|
DB::table('reports')->insert([
|
||||||
'media_task_assignment_id' => $mediaTaskAssignment->id,
|
'media_task_assignment_id' => $mediaTaskAssignment->id,
|
||||||
'title' => $cleanTitle,
|
'title' => $cleanTitle,
|
||||||
|
|||||||
@ -134,12 +134,32 @@ private function processReport(object $legacy): void
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert the report
|
[$cleanTitle, $cleanLink] = $this->extractLinkData($legacy);
|
||||||
|
|
||||||
|
$existing = DB::table('reports')
|
||||||
|
->where('media_task_assignment_id', $mediaTaskAssignment->id)
|
||||||
|
->where('publication_date', $legacy->broadcast)
|
||||||
|
->where('link', $cleanLink)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($existing) {
|
||||||
|
if (! isset($this->migratedIds[$existing->id])) {
|
||||||
|
$report = Report::find($existing->id);
|
||||||
|
if ($report) {
|
||||||
|
$this->migrateProof($report, $legacy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->output->writeln('<info>SKIP</info>');
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DB::table('reports')->insert([
|
DB::table('reports')->insert([
|
||||||
'media_task_assignment_id' => $mediaTaskAssignment->id,
|
'media_task_assignment_id' => $mediaTaskAssignment->id,
|
||||||
'title' => $legacy->title ?? '',
|
'title' => $cleanTitle,
|
||||||
'publication_date' => $legacy->broadcast,
|
'publication_date' => $legacy->broadcast,
|
||||||
'link' => $legacy->link ?? '',
|
'link' => $cleanLink,
|
||||||
'description' => '',
|
'description' => '',
|
||||||
'status' => $this->mapApprovalStatus((string) $legacy->status),
|
'status' => $this->mapApprovalStatus((string) $legacy->status),
|
||||||
'created_at' => $legacy->created_at ?? now(),
|
'created_at' => $legacy->created_at ?? now(),
|
||||||
@ -148,7 +168,6 @@ private function processReport(object $legacy): void
|
|||||||
|
|
||||||
$newReportId = (int) DB::getPdo()->lastInsertId();
|
$newReportId = (int) DB::getPdo()->lastInsertId();
|
||||||
|
|
||||||
// Migrate proof image if not already done
|
|
||||||
if (! isset($this->migratedIds[$newReportId])) {
|
if (! isset($this->migratedIds[$newReportId])) {
|
||||||
$report = Report::find($newReportId);
|
$report = Report::find($newReportId);
|
||||||
if ($report) {
|
if ($report) {
|
||||||
@ -222,6 +241,45 @@ private function guessMime(string $fileName): string
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ekstrak title & link bersih dari legacy report.
|
||||||
|
*
|
||||||
|
* @return array{0: string, 1: string} [title, link]
|
||||||
|
*/
|
||||||
|
private function extractLinkData(object $legacyReport): array
|
||||||
|
{
|
||||||
|
$rawTitle = trim($legacyReport->title ?? '');
|
||||||
|
$rawLink = trim($legacyReport->link ?? '');
|
||||||
|
|
||||||
|
$titleIsUrl = (bool) preg_match('#^https?://#i', $rawTitle);
|
||||||
|
|
||||||
|
preg_match('#https?://\S+#', $rawLink, $urlMatches);
|
||||||
|
$extractedUrl = rtrim($urlMatches[0] ?? '', '.,;)');
|
||||||
|
|
||||||
|
if ($titleIsUrl) {
|
||||||
|
$cleanLink = $rawTitle;
|
||||||
|
|
||||||
|
$lines = array_values(array_filter(
|
||||||
|
array_map('trim', preg_split('/[\r\n]+/', $rawLink))
|
||||||
|
));
|
||||||
|
$candidateTitle = '';
|
||||||
|
foreach ($lines as $line) {
|
||||||
|
if (! preg_match('#^https?://#i', $line)) {
|
||||||
|
$candidateTitle = $line;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$cleanTitle = $candidateTitle !== ''
|
||||||
|
? mb_substr($candidateTitle, 0, 255)
|
||||||
|
: mb_substr($rawTitle, 0, 255);
|
||||||
|
} else {
|
||||||
|
$cleanLink = $extractedUrl ?: mb_substr($rawLink, 0, 2048);
|
||||||
|
$cleanTitle = mb_substr($rawTitle, 0, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$cleanTitle, $cleanLink];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map legacy reports.status integer to ApprovalStatus enum value.
|
* Map legacy reports.status integer to ApprovalStatus enum value.
|
||||||
* Legacy: 0 = menunggu, 1 = menerima, 2 = menolak
|
* Legacy: 0 = menunggu, 1 = menerima, 2 = menolak
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user