231 lines
8.4 KiB
PHP
231 lines
8.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Item;
|
|
use App\Models\Language;
|
|
use App\Models\ReportReason;
|
|
use App\Models\ReportReasonTranslation;
|
|
use App\Models\User;
|
|
use App\Models\UserReports;
|
|
use App\Services\BootstrapTableService;
|
|
use App\Services\CachingService;
|
|
use App\Services\ResponseService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Throwable;
|
|
|
|
class ReportReasonController extends Controller {
|
|
|
|
public function index() {
|
|
ResponseService::noAnyPermissionThenRedirect(['report-reason-list', 'report-reason-create', 'report-reason-update', 'report-reason-delete']);
|
|
$languages = CachingService::getLanguages()->values();
|
|
return view('reports.index',compact('languages'));
|
|
}
|
|
|
|
public function store(Request $request) {
|
|
ResponseService::noPermissionThenSendJson('report-reason-create');
|
|
$validator = Validator::make($request->all(), [
|
|
'reason.1' => 'required|string'
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
ResponseService::validationError($validator->errors()->first());
|
|
}
|
|
try {
|
|
|
|
$reasons = $request->input('reason');
|
|
|
|
$englishReason = $reasons['1'] ?? null;
|
|
if (!$englishReason) {
|
|
ResponseService::validationError('English reason is required.');
|
|
}
|
|
|
|
$reportReason = ReportReason::create([
|
|
'reason' => $englishReason
|
|
]);
|
|
|
|
foreach ($reasons as $langId => $reasonText) {
|
|
|
|
if ($langId === '1' || empty($reasonText)) continue;
|
|
|
|
$language = Language::where('id', $langId)->first();
|
|
|
|
if ($language) {
|
|
ReportReasonTranslation::Create(
|
|
[
|
|
'report_reason_id' => $reportReason->id,
|
|
'language_id' => $language->id,
|
|
'reason' => $reasonText
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
ResponseService::successResponse('Reason Successfully Added');
|
|
|
|
} catch (Throwable $th) {
|
|
ResponseService::logErrorResponse($th, "ReportReason Controller -> store");
|
|
ResponseService::errorResponse('Something Went Wrong');
|
|
}
|
|
}
|
|
|
|
public function show(Request $request) {
|
|
ResponseService::noPermissionThenSendJson('report-reason-list');
|
|
$offset = $request->offset ?? 0;
|
|
$limit = $request->limit ?? 10;
|
|
$sort = $request->sort ?? 'id';
|
|
$order = $request->order ?? 'DESC';
|
|
$sql = ReportReason::with('translations')->orderBy($sort, $order);
|
|
if (!empty($request->search)) {
|
|
$sql = $sql->search($request->search);
|
|
}
|
|
|
|
$total = $sql->count();
|
|
$sql->skip($offset)->take($limit);
|
|
$result = $sql->get();
|
|
$bulkData = array();
|
|
$bulkData['total'] = $total;
|
|
$rows = array();
|
|
$no = 1;
|
|
foreach ($result as $key => $row) {
|
|
$tempRow = $row->toArray();
|
|
$tempRow['no'] = $no++;
|
|
$operate = '';
|
|
if (Auth::user()->can('report-reason-update')) {
|
|
$operate .= BootstrapTableService::editButton(route('report-reasons.update', $row->id), true,'#editModal', 'reportReasonEvents', $row->id);
|
|
}
|
|
|
|
if (Auth::user()->can('report-reason-delete')) {
|
|
$operate .= BootstrapTableService::deleteButton(route('report-reasons.destroy', $row->id));
|
|
}
|
|
$tempRow['operate'] = $operate;
|
|
$tempRow['translations'] = $row->translations->map(function ($t) {
|
|
return [
|
|
'language_id' => $t->language_id,
|
|
'reason' => $t->reason,
|
|
];
|
|
}) ?? [];
|
|
|
|
|
|
$rows[] = $tempRow;
|
|
}
|
|
|
|
$bulkData['rows'] = $rows;
|
|
return response()->json($bulkData);
|
|
}
|
|
|
|
public function update(Request $request, $id) {
|
|
try {
|
|
ResponseService::noPermissionThenSendJson('report-reason-update');
|
|
|
|
$reasons = $request->input('reason');
|
|
|
|
$englishReason = $reasons['1'] ?? null;
|
|
if (!$englishReason) {
|
|
ResponseService::validationError('English reason is required.');
|
|
}
|
|
|
|
$reportReason = ReportReason::findOrFail($id);
|
|
$reportReason->update([
|
|
'reason' => $englishReason
|
|
]);
|
|
|
|
foreach ($reasons as $langId => $reasonText) {
|
|
if ($langId == '1') continue;
|
|
|
|
if (!empty($reasonText)) {
|
|
ReportReasonTranslation::updateOrCreate(
|
|
['report_reason_id' => $id, 'language_id' => $langId],
|
|
['reason' => $reasonText]
|
|
);
|
|
}
|
|
}
|
|
|
|
ResponseService::successResponse('Reason Successfully Updated');
|
|
|
|
} catch (Throwable $th) {
|
|
ResponseService::logErrorResponse($th, "ReportReason Controller -> update");
|
|
ResponseService::errorResponse('Something Went Wrong');
|
|
}
|
|
}
|
|
|
|
|
|
public function destroy($id)
|
|
{
|
|
try {
|
|
ResponseService::noPermissionThenSendJson('report-reason-delete');
|
|
|
|
$reportReason = ReportReason::findOrFail($id);
|
|
|
|
// ✅ Check if any user report uses this reason
|
|
$isUsed = UserReports::where('report_reason_id', $id)->exists();
|
|
|
|
if ($isUsed) {
|
|
return ResponseService::errorResponse(
|
|
__('This reason is associated with existing user reports. Please remove those reports before deleting.'),
|
|
422 // Unprocessable Entity
|
|
);
|
|
}
|
|
|
|
// ✅ If not used, safe to delete
|
|
$reportReason->delete();
|
|
|
|
return ResponseService::successResponse(__('Reason Deleted Successfully'));
|
|
} catch (Throwable $e) {
|
|
ResponseService::logErrorResponse($e, "ReportReason Controller -> destroy");
|
|
return ResponseService::errorResponse(__('Something Went Wrong'));
|
|
}
|
|
}
|
|
public function usersReports() {
|
|
ResponseService::noPermissionThenRedirect('user-reports-list');
|
|
$users = User::select(["id", "name"])->has('user_reports')->get();
|
|
$items = Item::select(["id", "name","image"])->approved()->has('user_reports')->get();
|
|
return view('reports.user_reports', compact('users', 'items'));
|
|
}
|
|
|
|
public function userReportsShow(Request $request) {
|
|
try {
|
|
ResponseService::noPermissionThenRedirect('user-reports-list');
|
|
$offset = $request->offset ?? 0;
|
|
$limit = $request->limit ?? 10;
|
|
$sort = $request->sort ?? 'id';
|
|
$order = $request->order ?? 'DESC';
|
|
$sql = UserReports::with(['user' => fn($q) => $q->select(['id', 'name', 'deleted_at'])->withTrashed(),
|
|
'report_reason:id,reason',
|
|
'item' => fn($q) => $q->select(['id', 'name', 'deleted_at','user_id','image'])
|
|
->withTrashed()
|
|
->with(['user' => fn($q) => $q->select(['id', 'name', 'deleted_at'])->withTrashed()])])->sort($sort, $order);
|
|
|
|
if (!empty($request->search)) {
|
|
$sql = $sql->search($request->search);
|
|
}
|
|
|
|
if (!empty($request->filter)) {
|
|
$sql = $sql->filter(json_decode($request->filter, false, 512, JSON_THROW_ON_ERROR));
|
|
}
|
|
$total = $sql->count();
|
|
$sql->skip($offset)->take($limit);
|
|
$res = $sql->get();
|
|
$bulkData = array();
|
|
$bulkData['total'] = $total;
|
|
$rows = [];
|
|
foreach ($res as $row) {
|
|
$tempRow = $row->toArray();
|
|
$tempRow['user_status'] = isset($row->item->user) && empty($row->item->user->deleted_at);
|
|
$tempRow['item_status'] = empty($row->item->deleted_at);
|
|
$tempRow['reason'] = empty($row->report_reason_id) ? $row->other_message : $row->report_reason->reason;
|
|
$rows[] = $tempRow;
|
|
}
|
|
|
|
$bulkData['rows'] = $rows;
|
|
return response()->json($bulkData);
|
|
|
|
} catch (Throwable $e) {
|
|
ResponseService::logErrorResponse($e, "ReportReason Controller -> show");
|
|
ResponseService::errorResponse();
|
|
}
|
|
}
|
|
}
|