Files
Gnuboard7/app/Http/Controllers/Api/Admin/MailTemplateController.php
T
2026-04-01 10:30:52 +09:00

154 lines
5.2 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Admin;
use App\Http\Controllers\Api\Base\AdminBaseController;
use App\Http\Requests\MailTemplate\MailTemplateIndexRequest;
use App\Http\Requests\MailTemplate\MailTemplatePreviewRequest;
use App\Http\Requests\MailTemplate\UpdateMailTemplateRequest;
use App\Http\Resources\MailTemplateCollection;
use App\Http\Resources\MailTemplateResource;
use App\Models\MailTemplate;
use App\Services\MailTemplateService;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
/**
* 메일 템플릿 관리 컨트롤러
*
* 메일 템플릿의 조회, 수정, 미리보기, 초기화 기능을 제공합니다.
*/
class MailTemplateController extends AdminBaseController
{
/**
* MailTemplateController 생성자.
*
* @param MailTemplateService $mailTemplateService 메일 템플릿 서비스
*/
public function __construct(
private MailTemplateService $mailTemplateService
) {
parent::__construct();
}
/**
* 메일 템플릿 목록을 페이지네이션하여 조회합니다.
*
* @param MailTemplateIndexRequest $request 검증된 목록 조회 요청
* @return JsonResponse 페이지네이션된 템플릿 목록
*/
public function index(MailTemplateIndexRequest $request): JsonResponse
{
try {
$filters = array_filter($request->validated(), fn ($value) => $value !== null);
$perPage = (int) ($request->validated('per_page') ?? 20);
$templates = $this->mailTemplateService->getTemplates($filters, $perPage);
$collection = new MailTemplateCollection($templates);
return $this->success('mail_template.fetch_success', $collection->toArray($request));
} catch (\Exception $e) {
Log::error('메일 템플릿 목록 조회 실패', ['error' => $e->getMessage()]);
return $this->error('mail_template.fetch_failed', 500);
}
}
/**
* 메일 템플릿을 수정합니다.
*
* @param UpdateMailTemplateRequest $request 수정 요청
* @param MailTemplate $mailTemplate 수정 대상
* @return JsonResponse 수정 결과
*/
public function update(UpdateMailTemplateRequest $request, MailTemplate $mailTemplate): JsonResponse
{
try {
$userId = $request->user()?->id;
$template = $this->mailTemplateService->updateTemplate(
$mailTemplate,
$request->validated(),
$userId
);
return $this->success(
'mail_template.save_success',
new MailTemplateResource($template)
);
} catch (\Exception $e) {
Log::error('메일 템플릿 수정 실패', ['error' => $e->getMessage()]);
return $this->error('mail_template.save_error', 500);
}
}
/**
* 메일 템플릿의 활성 상태를 토글합니다.
*
* @param MailTemplate $mailTemplate 토글 대상
* @return JsonResponse 토글 결과
*/
public function toggleActive(MailTemplate $mailTemplate): JsonResponse
{
try {
$template = $this->mailTemplateService->toggleActive($mailTemplate);
return $this->success(
'mail_template.toggle_success',
new MailTemplateResource($template)
);
} catch (\Exception $e) {
Log::error('메일 템플릿 활성 상태 토글 실패', ['error' => $e->getMessage()]);
return $this->error('mail_template.toggle_failed', 500);
}
}
/**
* 메일 템플릿 미리보기를 반환합니다.
*
* @param MailTemplatePreviewRequest $request 검증된 미리보기 요청
* @return JsonResponse 미리보기 결과
*/
public function preview(MailTemplatePreviewRequest $request): JsonResponse
{
try {
$result = $this->mailTemplateService->getPreview($request->validated());
return $this->success('mail_template.preview_success', $result);
} catch (\Exception $e) {
Log::error('메일 템플릿 미리보기 실패', ['error' => $e->getMessage()]);
return $this->error('mail_template.preview_failed', 500);
}
}
/**
* 메일 템플릿을 시더 기본값으로 복원합니다.
*
* @param MailTemplate $mailTemplate 복원 대상
* @return JsonResponse 복원 결과
*/
public function reset(MailTemplate $mailTemplate): JsonResponse
{
try {
$defaultData = $this->mailTemplateService->getDefaultTemplateData($mailTemplate->type);
if (! $defaultData) {
return $this->error('mail_template.reset_no_default', 404);
}
$template = $this->mailTemplateService->resetToDefault($mailTemplate, $defaultData);
return $this->success(
'mail_template.reset_success',
new MailTemplateResource($template)
);
} catch (\Exception $e) {
Log::error('메일 템플릿 기본값 복원 실패', ['error' => $e->getMessage()]);
return $this->error('mail_template.reset_failed', 500);
}
}
}