fix(core): harden settlement and wallet integration

This commit is contained in:
wchino
2026-07-22 01:40:37 +08:00
parent 150c3e7ebd
commit 35f6e46958
54 changed files with 2564 additions and 359 deletions

View File

@@ -2,8 +2,9 @@
namespace App\Http\Controllers\Api\V1\Admin\Reports;
use App\Models\AdminUser;
use App\Models\ReportJob;
use Illuminate\Http\Request;
use App\Support\AdminReportJobPolicy;
use App\Services\Admin\AdminReportJobService;
use App\Services\Admin\AdminReportQueryService;
use App\Services\Admin\AdminReportSpreadsheetExporter;
@@ -13,11 +14,20 @@ use Symfony\Component\HttpFoundation\StreamedResponse;
final class ReportJobDownloadController
{
public function __invoke(
Request $request,
ReportJob $report_job,
AdminReportJobService $service,
AdminReportQueryService $queryService,
AdminReportSpreadsheetExporter $spreadsheetExporter,
): StreamedResponse {
$admin = $request->lotteryAdmin();
abort_if($admin === null, 401);
abort_unless(AdminReportJobPolicy::jobAccessible($admin, $report_job), 403);
abort_unless(
AdminReportJobPolicy::canExportReportType($admin, (string) $report_job->report_type),
403,
);
$filterJson = is_array($report_job->filter_json) ? $report_job->filter_json : null;
$range = $queryService->resolveDateRange($filterJson);
$dateFrom = $range['date_from'];
@@ -30,8 +40,7 @@ final class ReportJobDownloadController
$dateTo,
);
$filename = $label.'_'.$pathSuffix.'.'.$report_job->export_format;
$scopedAdmin = AdminUser::query()->find((int) $report_job->admin_user_id);
$rows = $service->reportRows((string) $report_job->report_type, $filterJson, $scopedAdmin);
$rows = $service->reportRows((string) $report_job->report_type, $filterJson, $admin);
if ((string) $report_job->export_format === 'xlsx') {
return $spreadsheetExporter->streamDownload($rows, $filename);

View File

@@ -2,17 +2,21 @@
namespace App\Http\Controllers\Api\V1\Admin\Reports;
use App\Http\Controllers\Controller;
use App\Models\ReportJob;
use Illuminate\Http\Request;
use App\Support\AdminApiList;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Support\AdminReportJobPolicy;
/** GET /api/v1/admin/report-jobs */
final class ReportJobIndexController extends Controller
{
public function __invoke(Request $request): JsonResponse
{
$admin = $request->lotteryAdmin();
abort_if($admin === null, 401);
$p = AdminApiList::readPaging($request);
$reportType = trim((string) $request->query('report_type', ''));
@@ -23,6 +27,8 @@ final class ReportJobIndexController extends Controller
$query->where('report_type', $reportType);
}
AdminReportJobPolicy::applyToJobsQuery($query, $admin);
$paginator = $query->paginate($p['perPage'], ['*'], 'page', $p['page']);
return AdminApiList::json($paginator, fn (ReportJob $j) => $this->row($j));

View File

@@ -2,16 +2,22 @@
namespace App\Http\Controllers\Api\V1\Admin\Reports;
use App\Http\Controllers\Controller;
use App\Models\ReportJob;
use App\Support\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use App\Support\AdminReportJobPolicy;
/** GET /api/v1/admin/report-jobs/{report_job} */
final class ReportJobShowController extends Controller
{
public function __invoke(ReportJob $report_job): JsonResponse
public function __invoke(Request $request, ReportJob $report_job): JsonResponse
{
$admin = $request->lotteryAdmin();
abort_if($admin === null, 401);
abort_unless(AdminReportJobPolicy::jobAccessible($admin, $report_job), 403);
return ApiResponse::success([
'id' => (int) $report_job->id,
'job_no' => $report_job->job_no,

View File

@@ -2,12 +2,13 @@
namespace App\Http\Controllers\Api\V1\Admin\Reports;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ReportJobStoreRequest;
use App\Models\AdminUser;
use App\Services\Admin\AdminReportJobService;
use App\Support\ApiResponse;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use App\Support\AdminReportJobPolicy;
use App\Services\Admin\AdminReportJobService;
use App\Http\Requests\Admin\ReportJobStoreRequest;
/** POST /api/v1/admin/report-jobs */
final class ReportJobStoreController extends Controller
@@ -18,6 +19,10 @@ final class ReportJobStoreController extends Controller
$admin = $request->lotteryAdmin();
$data = $request->validated();
abort_unless(
AdminReportJobPolicy::canExportReportType($admin, (string) $data['report_type']),
403,
);
$job = $service->enqueue(
$admin,
@@ -35,4 +40,4 @@ final class ReportJobStoreController extends Controller
'status' => $job->status,
]);
}
}
}