giftcon_dev/app/Services/QnaService.php
2026-02-09 19:47:58 +09:00

81 lines
2.7 KiB
PHP

<?php
namespace App\Services;
use App\Jobs\SendAdminQnaCreatedMailJob;
use App\Repositories\Cs\CsQnaRepository;
use App\Support\LegacyCrypto\CiSeedCrypto;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
final class QnaService
{
public function __construct(
private readonly CsQnaRepository $repo,
private readonly CiSeedCrypto $seed,
) {}
public function paginateMyQna(int $memNo, int $perPage = 10, int $year = 0): LengthAwarePaginator
{
return $this->repo->paginateMyQna($memNo, $perPage, $year);
}
public function findMyQna(int $memNo, int $seq, int $year = 0)
{
return $this->repo->findMyQna($memNo, $seq, $year);
}
public function getEnquiryCodes(): array
{
return $this->repo->getEnquiryCodes();
}
/**
* 1:1 문의 등록
*/
public function createQna(int $memNo, array $payload, ?int $year = null): int
{
$year = $year ?: (int) date('Y');
// 컨트롤러에서 이미 sanitize/검증하지만, 서비스에서도 최소 방어(이중 안전)
$enquiryCode = (string)($payload['enquiry_code'] ?? '');
$enquiryTitle = strip_tags(trim((string)($payload['enquiry_title'] ?? '')));
$enquiryContent = strip_tags(trim((string)($payload['enquiry_content'] ?? '')));
$returnType = (string)($payload['return_type'] ?? 'web');
$id = $this->repo->insertQna($memNo, [
'enquiry_code' => $enquiryCode,
'enquiry_title' => $enquiryTitle,
'enquiry_content' => $enquiryContent,
'return_type' => $returnType,
], $year);
// 메일 발송 데이터 구성
$userEmail = (string)($payload['_user_email'] ?? '');
$userName = (string)($payload['_user_name'] ?? '');
$ip = (string)($payload['_ip'] ?? '');
$cellEnc = (string)($payload['_user_cell_enc'] ?? '');
$cellPlain = '';
try {
$cellPlain = (string) $this->seed->decrypt($cellEnc);
} catch (\Throwable $e) {
$cellPlain = ''; // 복호화 실패해도 문의 등록은 유지
}
SendAdminQnaCreatedMailJob::dispatch($memNo, $id, [
'name' => $userName,
'email' => $userEmail,
'cell' => $cellPlain,
'ip' => $ip,
'year' => $year,
'enquiry_code' => $enquiryCode,
'enquiry_title' => $enquiryTitle,
'enquiry_content' => $enquiryContent,
'return_type' => $returnType,
'created_at' => now()->toDateTimeString(),
])->onConnection('redis');
return $id;
}
}