diff --git a/app/Http/Controllers/DetailsController.php b/app/Http/Controllers/DetailsController.php index 3a7f3271f..d32a4924d 100644 --- a/app/Http/Controllers/DetailsController.php +++ b/app/Http/Controllers/DetailsController.php @@ -79,6 +79,12 @@ class DetailsController extends BasePageController ->get(); $reportCount = $reportData->count(); $reportReasons = ReleaseReport::reasonKeysToLabels($reportData->pluck('reason')->unique()->implode(', ')); + $originalReportData = ReleaseReport::query() + ->where('releases_id', $data['id']) + ->orderByDesc('created_at') + ->get(); + $totalReportCount = $originalReportData->count(); + $allReportReasons = ReleaseReport::reasonKeysToLabels($originalReportData->pluck('reason')->unique()->implode(', ')); $publicReportResponses = ReleaseReport::query() ->with('responder') ->where('releases_id', $data['id']) @@ -185,6 +191,9 @@ class DetailsController extends BasePageController 'failed' => $failed, 'reportCount' => $reportCount, 'reportReasons' => $reportReasons, + 'originalReportData' => $originalReportData, + 'totalReportCount' => $totalReportCount, + 'allReportReasons' => $allReportReasons, 'publicReportResponses' => $publicReportResponses, 'regex' => $releaseRegex, 'downloadedby' => $downloadedBy, diff --git a/app/Services/Releases/ReleaseBrowseService.php b/app/Services/Releases/ReleaseBrowseService.php index 3dbfedc64..4b154af30 100644 --- a/app/Services/Releases/ReleaseBrowseService.php +++ b/app/Services/Releases/ReleaseBrowseService.php @@ -165,8 +165,12 @@ class ReleaseBrowseService $outerSelect = "SELECT r.id, r.searchname, r.guid, r.postdate, r.categories_id, r.size, r.totalpart, r.fromname, r.grabs, r.comments, r.adddate, r.videos_id, r.haspreview, r.jpgstatus, r.nfostatus, r.group_name, CONCAT(cp.title, ' > ', c.title) AS category_name, df.failed AS failed_count, + rr.total_report_count AS total_report_count, rr.report_count AS report_count, rr.report_reasons AS report_reasons, + rr.all_report_reasons AS all_report_reasons, + rr.latest_report_reason AS latest_report_reason, + rr.latest_report_description AS latest_report_description, rr.response_count AS report_response_count, rr.latest_response_at AS latest_report_response_at, rn.releases_id AS nfoid, @@ -178,7 +182,7 @@ class ReleaseBrowseService LEFT OUTER JOIN video_data re ON re.releases_id = r.id LEFT OUTER JOIN release_nfos rn ON rn.releases_id = r.id LEFT OUTER JOIN dnzb_failures df ON df.release_id = r.id - LEFT OUTER JOIN (SELECT releases_id, SUM(CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN 1 ELSE 0 END) AS report_count, GROUP_CONCAT(DISTINCT CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN reason ELSE NULL END SEPARATOR ', ') AS report_reasons, SUM(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN 1 ELSE 0 END) AS response_count, MAX(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN responded_at ELSE NULL END) AS latest_response_at FROM release_reports GROUP BY releases_id) rr ON rr.releases_id = r.id"; + LEFT OUTER JOIN (SELECT releases_id, COUNT(*) AS total_report_count, SUM(CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN 1 ELSE 0 END) AS report_count, GROUP_CONCAT(DISTINCT CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN reason ELSE NULL END SEPARATOR ', ') AS report_reasons, GROUP_CONCAT(DISTINCT reason SEPARATOR ', ') AS all_report_reasons, SUBSTRING_INDEX(GROUP_CONCAT(reason ORDER BY created_at DESC SEPARATOR ','), ',', 1) AS latest_report_reason, SUBSTRING_INDEX(GROUP_CONCAT(COALESCE(NULLIF(description, ''), 'No additional report details were provided.') ORDER BY created_at DESC SEPARATOR ' || '), ' || ', 1) AS latest_report_description, SUM(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN 1 ELSE 0 END) AS response_count, MAX(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN responded_at ELSE NULL END) AS latest_response_at FROM release_reports GROUP BY releases_id) rr ON rr.releases_id = r.id"; $innerSelect = 'SELECT r.id, r.searchname, r.guid, r.postdate, r.groups_id, r.categories_id, r.size, r.totalpart, r.fromname, r.passwordstatus, r.grabs, r.comments, r.adddate, r.videos_id, r.haspreview, r.jpgstatus, r.nfostatus, g.name AS group_name, r.movieinfo_id'; } diff --git a/app/Services/Releases/ReleaseSearchService.php b/app/Services/Releases/ReleaseSearchService.php index c7150efb0..9c5f9f79f 100644 --- a/app/Services/Releases/ReleaseSearchService.php +++ b/app/Services/Releases/ReleaseSearchService.php @@ -1901,8 +1901,12 @@ class ReleaseSearchService r.videos_id, r.haspreview, r.jpgstatus, r.nfostatus, CONCAT(cp.title, ' > ', c.title) AS category_name, df.failed AS failed_count, + rr.total_report_count AS total_report_count, rr.report_count AS report_count, rr.report_reasons AS report_reasons, + rr.all_report_reasons AS all_report_reasons, + rr.latest_report_reason AS latest_report_reason, + rr.latest_report_description AS latest_report_description, rr.response_count AS report_response_count, rr.latest_response_at AS latest_report_response_at, g.name AS group_name, @@ -1917,7 +1921,7 @@ class ReleaseSearchService LEFT JOIN categories c ON c.id = r.categories_id LEFT JOIN root_categories cp ON cp.id = c.root_categories_id LEFT OUTER JOIN dnzb_failures df ON df.release_id = r.id - LEFT OUTER JOIN (SELECT releases_id, SUM(CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN 1 ELSE 0 END) AS report_count, GROUP_CONCAT(DISTINCT CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN reason ELSE NULL END SEPARATOR ', ') AS report_reasons, SUM(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN 1 ELSE 0 END) AS response_count, MAX(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN responded_at ELSE NULL END) AS latest_response_at FROM release_reports GROUP BY releases_id) rr ON rr.releases_id = r.id + LEFT OUTER JOIN (SELECT releases_id, COUNT(*) AS total_report_count, SUM(CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN 1 ELSE 0 END) AS report_count, GROUP_CONCAT(DISTINCT CASE WHEN status IN ('pending', 'reviewed', 'resolved') THEN reason ELSE NULL END SEPARATOR ', ') AS report_reasons, GROUP_CONCAT(DISTINCT reason SEPARATOR ', ') AS all_report_reasons, SUBSTRING_INDEX(GROUP_CONCAT(reason ORDER BY created_at DESC SEPARATOR ','), ',', 1) AS latest_report_reason, SUBSTRING_INDEX(GROUP_CONCAT(COALESCE(NULLIF(description, ''), 'No additional report details were provided.') ORDER BY created_at DESC SEPARATOR ' || '), ' || ', 1) AS latest_report_description, SUM(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN 1 ELSE 0 END) AS response_count, MAX(CASE WHEN response IS NOT NULL AND response != '' AND response_is_public = 1 THEN responded_at ELSE NULL END) AS latest_response_at FROM release_reports GROUP BY releases_id) rr ON rr.releases_id = r.id %s", $whereSql ); diff --git a/resources/views/browse/index.blade.php b/resources/views/browse/index.blade.php index f2ae26fb6..3b10781fd 100644 --- a/resources/views/browse/index.blade.php +++ b/resources/views/browse/index.blade.php @@ -136,10 +136,10 @@
{{ $result->searchname }} - @if(!empty($result->report_count) && $result->report_count > 0) + @if(!empty($result->total_report_count) && $result->total_report_count > 0) - Reported ({{ $result->report_count }}) + title="Reported: {{ $result->all_report_reasons ?? 'Unknown' }} | Original report: {{ $result->latest_report_reason ?? 'Unknown' }} - {{ $result->latest_report_description ?? 'No additional report details were provided.' }}"> + Reported ({{ $result->total_report_count }}) @endif @if(!empty($result->report_response_count) && $result->report_response_count > 0) @@ -261,7 +261,7 @@ @endif - +
@@ -290,10 +290,10 @@ {{ $result->searchname }}
- @if(!empty($result->report_count) && $result->report_count > 0) + @if(!empty($result->total_report_count) && $result->total_report_count > 0) - Reported ({{ $result->report_count }}) + title="Reported: {{ $result->all_report_reasons ?? 'Unknown' }} | Original report: {{ $result->latest_report_reason ?? 'Unknown' }} - {{ $result->latest_report_description ?? 'No additional report details were provided.' }}"> + Reported ({{ $result->total_report_count }}) @endif @if(!empty($result->report_response_count) && $result->report_response_count > 0) @@ -322,7 +322,7 @@ - +
diff --git a/resources/views/components/report-button.blade.php b/resources/views/components/report-button.blade.php index 9ab75f12f..f37538637 100644 --- a/resources/views/components/report-button.blade.php +++ b/resources/views/components/report-button.blade.php @@ -5,37 +5,48 @@ 'releaseGuid' => null, 'size' => 'sm', // sm, md, lg 'variant' => 'icon', // icon, button, button-lg, text + 'reportedCount' => 0, ]) +@php + $reportedCount = (int) $reportedCount; + $hasReports = $reportedCount > 0; + $reportTitle = $hasReports + ? 'This release has already been reported. Click to submit another report.' + : 'Report this release'; +@endphp + @auth @if($variant === 'icon') @elseif($variant === 'button-lg') @elseif($variant === 'button') @else @endif @endauth diff --git a/resources/views/details/index.blade.php b/resources/views/details/index.blade.php index a9584d5d6..e72bc7c9b 100644 --- a/resources/views/details/index.blade.php +++ b/resources/views/details/index.blade.php @@ -34,11 +34,11 @@

{{ $release->searchname }}

- @if(!empty($reportCount) && $reportCount > 0) + @if(!empty($totalReportCount) && $totalReportCount > 0)
+ title="Reported: {{ $allReportReasons ?? 'Unknown' }}"> - {{ $reportCount }} report{{ $reportCount > 1 ? 's' : '' }}: {{ $reportReasons ?? 'Unknown' }} + Reported ({{ $totalReportCount }}): {{ $allReportReasons ?? 'Unknown' }}
@endif @if(!empty($failed) && $failed > 0) @@ -68,8 +68,32 @@ @endif @endauth - +
+ @if(!empty($originalReportData) && $originalReportData->count() > 0) +
+

+ Original report +

+
+ @foreach($originalReportData as $originalReport) +
+
+ + {{ $originalReport->reason_label }} + + + {{ ucfirst($originalReport->status) }} ยท Reported {{ $originalReport->created_at->format('M d, Y H:i') }} + +
+
+ {{ $originalReport->description ?: 'No additional report details were provided.' }} +
+
+ @endforeach +
+
+ @endif @if(!empty($publicReportResponses) && $publicReportResponses->count() > 0)

diff --git a/tests/Feature/AdminReleaseReportControllerTest.php b/tests/Feature/AdminReleaseReportControllerTest.php index 5f2ff2d3c..a669e1395 100644 --- a/tests/Feature/AdminReleaseReportControllerTest.php +++ b/tests/Feature/AdminReleaseReportControllerTest.php @@ -320,10 +320,17 @@ class AdminReleaseReportControllerTest extends TestCase $browseService = file_get_contents($browseServicePath); $this->assertStringContainsString('publicReportResponses', $detailsController); + $this->assertStringContainsString('originalReportData', $detailsController); + $this->assertStringContainsString('totalReportCount', $detailsController); $this->assertStringContainsString("where('response_is_public', true)", $detailsController); $this->assertStringContainsString('Staff response', $detailsView); + $this->assertStringContainsString('Original report', $detailsView); + $this->assertStringContainsString('total_report_count', $browseService); + $this->assertStringContainsString('latest_report_description', $browseService); + $this->assertStringContainsString('all_report_reasons', $browseService); $this->assertStringContainsString('report_response_count', $browseService); $this->assertStringContainsString('response_is_public = 1', $browseService); + $this->assertStringContainsString('Original report:', $browseView); $this->assertStringContainsString('Staff response available on release details', $browseView); } }