giftcon_dev/app/Http/Controllers/Web/Mypage/UsageController.php
2026-03-06 15:48:44 +09:00

175 lines
5.7 KiB
PHP

<?php
namespace App\Http\Controllers\Web\Mypage;
use App\Http\Controllers\Controller;
use App\Services\Mypage\UsageService;
use App\Services\Payments\OwnPinIssueService;
use Illuminate\Http\Request;
final class UsageController extends Controller
{
public function __construct(
private readonly UsageService $service,
private readonly OwnPinIssueService $ownPinIssueService,
) {}
public function issuePinInstant(Request $request, int $attemptId)
{
if ((bool)session('_sess._login_') !== true) {
return redirect()->route('web.auth.login');
}
$memNo = (int)session('_sess._mno', 0);
if ($memNo <= 0) abort(403);
$out = $this->ownPinIssueService->issuePinInstant($attemptId, $memNo);
if (!($out['ok'] ?? false)) {
return redirect()->back()->with('error', (string)($out['message'] ?? '발행 실패'));
}
return redirect()->route('web.mypage.usage.show', ['attemptId' => $attemptId])
->with('success', (string)($out['message'] ?? '발행 완료'));
}
public function revealPins(Request $request, int $attemptId)
{
if ((bool)session('_sess._login_') !== true) {
return redirect()->route('web.auth.login');
}
$memNo = (int)session('_sess._mno', 0);
if ($memNo <= 0) abort(403);
$data = $request->validate([
'pin2' => ['required', 'string', 'min:4', 'max:20'],
]);
$out = $this->service->revealPins(
$attemptId,
$memNo,
(string)$data['pin2']
);
if (!($out['ok'] ?? false)) {
return redirect()
->route('web.mypage.usage.show', ['attemptId' => $attemptId])
->with('error', (string)($out['message'] ?? '핀번호 확인에 실패했습니다.'));
}
return redirect()
->route('web.mypage.usage.show', ['attemptId' => $attemptId, 'revealed' => 1])
->with('success', '핀번호 확인이 완료되었습니다.');
}
/**
* GET /mypage/usage
* - 리스트 + 검색 + 페이징
* - 호환: /mypage/usage?attempt_id=123 -> show로 redirect
*/
public function index(Request $request)
{
if ((bool)session('_sess._login_') !== true) {
return redirect()->route('web.auth.login');
}
$memNo = (int)session('_sess._mno', 0);
if ($memNo <= 0) abort(403);
$attemptId = $request->query('attempt_id');
$attemptId = is_numeric($attemptId) ? (int)$attemptId : null;
if ($attemptId !== null && $attemptId >= 1) {
return redirect()->route('web.mypage.usage.show', ['attemptId' => $attemptId]);
}
$filters = [
'q' => trim((string)$request->query('q', '')),
'method' => trim((string)$request->query('method', '')),
'status' => trim((string)$request->query('status', '')),
'from' => trim((string)$request->query('from', '')),
'to' => trim((string)$request->query('to', '')),
];
$data = $this->service->buildListPageData($memNo, $filters);
return view('web.mypage.usage.index', $data);
}
/**
* GET /mypage/usage/{attemptId}
*/
public function show(Request $request, int $attemptId)
{
if ((bool)session('_sess._login_') !== true) {
return redirect()->route('web.auth.login');
}
$memNo = (int)session('_sess._mno', 0);
if ($memNo <= 0) abort(403);
$data = $this->service->buildDetailPageData($attemptId, $memNo);
return view('web.mypage.usage.show', $data);
}
/**
* POST /mypage/usage/{attemptId}/open
* - 핀 "오픈(확인)" 처리: ret_data에 pin_opened_at 기록
*/
public function openPins(Request $request, int $attemptId)
{
if ((bool)session('_sess._login_') !== true) {
return redirect()->route('web.auth.login');
}
$memNo = (int)session('_sess._mno', 0);
if ($memNo <= 0) abort(403);
$out = $this->service->openPins($attemptId, $memNo);
if (!($out['ok'] ?? false)) {
return redirect()->back()->with('error', (string)($out['message'] ?? '처리 실패'));
}
return redirect()->route('web.mypage.usage.show', ['attemptId' => $attemptId])
->with('success', '핀 확인이 완료되었습니다.');
}
/**
* POST /mypage/usage/{attemptId}/cancel
* - 결제완료 후 취소(핀 오픈 전만)
*/
public function cancel(Request $request, int $attemptId)
{
if ((bool)session('_sess._login_') !== true) {
return redirect()->route('web.auth.login');
}
$memNo = (int)session('_sess._mno', 0);
if ($memNo <= 0) abort(403);
$data = $request->validate([
'reason' => ['nullable','string','max:255'],
]);
$out = $this->service->cancelPaidAttempt($attemptId, $memNo, (string)($data['reason'] ?? '사용자 요청'));
if (!($out['ok'] ?? false)) {
return redirect()->back()->with('error', (string)($out['message'] ?? '취소 실패'));
}
return redirect()->route('web.mypage.usage.show', array_filter([
'attemptId' => $attemptId,
'q' => $request->input('q'),
'method' => $request->input('method'),
'status' => $request->input('status'),
'from' => $request->input('from'),
'to' => $request->input('to'),
'page' => $request->input('page'),
], fn ($v) => $v !== null && $v !== ''))
->with('success', '결제가 취소되었습니다.');
}
}