93 lines
3.5 KiB
PHP
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']]);
|
|
}
|
|
}
|