feat: implement admin SMTP settings management and automated order notification system
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Api\Admin\Setting;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Facade\SignRSA;
|
||||
use App\Models\Setting;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class SettingController extends Controller
|
||||
{
|
||||
/**
|
||||
* GET /administrator/settings
|
||||
* Returns all setting keys: setting, smtp.
|
||||
*/
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$setting = Setting::where('key', 'setting')->first();
|
||||
$smtp = Setting::where('key', 'smtp')->first();
|
||||
|
||||
$settingValue = $setting ? json_decode((string) $setting->value, true) : [];
|
||||
$smtpValue = $smtp ? json_decode((string) $smtp->value, true) : [];
|
||||
|
||||
// Never expose raw smtp password
|
||||
if (isset($smtpValue['password']) && !empty($smtpValue['password'])) {
|
||||
$smtpValue['password'] = '********';
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'data' => [
|
||||
'setting' => $settingValue,
|
||||
'smtp' => $smtpValue,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* PUT /administrator/settings
|
||||
* Accepts: { setting: {...}, smtp: {...} }
|
||||
*/
|
||||
public function update(Request $request): JsonResponse
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'setting' => 'sometimes|array',
|
||||
'smtp' => 'sometimes|array',
|
||||
'smtp.host' => 'sometimes|string',
|
||||
'smtp.port' => 'sometimes|integer',
|
||||
'smtp.user' => 'sometimes|email',
|
||||
'smtp.encryption' => 'sometimes|in:ssl,tls,starttls,',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json(['error' => true, 'message' => $validator->errors()->first()], 422);
|
||||
}
|
||||
|
||||
if ($request->has('setting')) {
|
||||
$current = Setting::where('key', 'setting')->first();
|
||||
$existing = $current ? json_decode((string) $current->value, true) : [];
|
||||
$merged = array_merge($existing, $request->input('setting'));
|
||||
|
||||
Setting::updateOrCreate(
|
||||
['key' => 'setting'],
|
||||
['value' => json_encode($merged, JSON_UNESCAPED_UNICODE)]
|
||||
);
|
||||
}
|
||||
|
||||
if ($request->has('smtp')) {
|
||||
$smtpData = $request->input('smtp');
|
||||
$current = Setting::where('key', 'smtp')->first();
|
||||
$existing = $current ? json_decode((string) $current->value, true) : [];
|
||||
|
||||
// Keep existing password if placeholder sent (not changed)
|
||||
if (isset($smtpData['password']) && $smtpData['password'] === '********') {
|
||||
$smtpData['password'] = $existing['password'] ?? '';
|
||||
} elseif (isset($smtpData['password']) && !empty($smtpData['password'])) {
|
||||
$smtpData['password'] = SignRSA::EncryptFunc($smtpData['password']);
|
||||
}
|
||||
|
||||
$merged = array_merge($existing, $smtpData);
|
||||
|
||||
Setting::updateOrCreate(
|
||||
['key' => 'smtp'],
|
||||
['value' => json_encode($merged, JSON_UNESCAPED_UNICODE)]
|
||||
);
|
||||
|
||||
// Flush mail config cache so new SMTP settings take effect immediately
|
||||
Cache::forget('mail_config');
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => 'Cập nhật cài đặt thành công.',
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user