giftcon_dev/app/Http/Controllers/Admin/Product/AdminPinController.php
2026-03-03 15:13:16 +09:00

93 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers\Admin\Product;
use App\Services\Admin\Product\AdminPinService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Crypt;
final class AdminPinController
{
public function __construct(
private readonly AdminPinService $service,
) {}
// 핀 관리 메인 화면 (권종 선택 후 진입)
public function index(int $productId, int $skuId, Request $request)
{
$product = DB::table('gc_products')->find($productId);
$sku = DB::table('gc_product_skus')->find($skuId);
if (!$product || !$sku) {
return redirect()->back()->with('toast', ['type' => 'danger', 'message' => '잘못된 접근입니다.']);
}
// 수정된 Service 반환값(배열) 받기
$pinData = $this->service->getPinsBySku($skuId, $request->all());
$pins = $pinData['pins'];
$stats = $pinData['stats']; // 통계 데이터
$pins->getCollection()->transform(function ($pin) {
try {
$decrypted = Crypt::decryptString($pin->pin_code);
$length = strlen($decrypted);
$pin->decrypted_code = substr($decrypted, 0, 4) . str_repeat('*', max(0, $length - 8)) . substr($decrypted, -4);
} catch (\Exception $e) {
$pin->decrypted_code = '복호화 에러';
}
return $pin;
});
// 뷰로 변수 묶어서 전달
return view('admin.product.pins.index', compact('product', 'sku', 'pins', 'stats'));
}
// 핀 회수 및 다운로드 요청 처리
public function recallBulk(Request $request, int $productId, int $skuId)
{
$request->validate([
'amount_type' => ['required', 'string'],
'custom_amount' => ['nullable', 'integer', 'min:1'],
'zip_password' => ['required', 'string', 'min:4'],
]);
$amount = (int)$request->input('custom_amount', 0);
if ($request->input('amount_type') !== 'ALL' && $amount <= 0) {
$amount = (int)$request->input('amount_type');
}
$res = $this->service->recallPins($skuId, $request->input('amount_type'), $amount, $request->input('zip_password'));
if (!$res['ok']) {
return redirect()->back()->with('toast', ['type' => 'danger', 'title' => '오류', 'message' => $res['message']]);
}
// 성공 시 응답으로 파일을 다운로드하고, 전송이 끝나면 서버에서 임시 zip 파일을 즉시 삭제(deleteFileAfterSend)
return response()->download($res['file_path'], $res['file_name'])->deleteFileAfterSend(true);
}
// 대량 등록 처리
public function storeBulk(Request $request, int $productId, int $skuId)
{
$request->validate([
'bulk_text' => ['required', 'string'],
'expiry_date' => ['nullable', 'date'],
]);
$res = $this->service->bulkRegisterPins(
$productId,
$skuId,
$request->input('bulk_text'),
$request->input('expiry_date')
);
if (!$res['ok']) {
return redirect()->back()->withInput()->with('toast', ['type' => 'danger', 'title' => '등록 실패', 'message' => $res['message']]);
}
return redirect()->route('admin.pins.index', ['productId' => $productId, 'skuId' => $skuId])
->with('toast', ['type' => 'success', 'title' => '완료', 'message' => $res['message']]);
}
}