Files
portal-api/app/Http/Controllers/Api/Client/Concerns/ManagesClientAccountSettings.php
baodev0andClaude Opus 5.5 e888a6ed5d feat: Turnstile captcha, menu khách + nút tắt topbar cấu hình từ admin, ẩn setting nhạy cảm
- Turnstile (App\Support\Turnstile, middleware turnstile) cho login admin và login/register/forgot/reset của khách; cấu hình ở setting key=turnstile, secret mã hoá SignRSA.
- Menu sidebar khách (setting client_menu) và nút tắt topbar (setting client_quick_links) do admin sửa qua administrator/client-menu[/quick-links], khách đọc v1/setting/menu, v1/setting/quick-links.
- v1/setting và settings/public chỉ trả whitelist PublicSetting::FIELDS (trước đây lộ bot_token, inet_api_key).
- Cài đặt tài khoản khách (preferences), rate limit theo IP cho register/resend-verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 15:53:43 +07:00

73 lines
2.4 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Client\Concerns;
use App\Http\Requests\Api\Client\ClientPreferencesRequest;
use App\Http\Resources\Api\Client\ClientResource;
use App\Models\ActivityLog;
use Illuminate\Http\Request;
trait ManagesClientAccountSettings
{
public function loginHistory(Request $request)
{
$validated = $request->validate([
'page' => ['sometimes', 'integer', 'min:1'],
'per_page' => ['sometimes', 'integer', 'in:10,20,50'],
]);
$customer = auth('client')->user();
$history = ActivityLog::query()
->where('log_name', 'auth')
->where('causer_type', 'customer')
->where('causer_id', $customer->id)
->whereIn('event', ['login', 'logout'])
->latest('created_at')
->paginate($validated['per_page'] ?? 10);
return response()->json([
'error' => false,
'data' => collect($history->items())->map(fn (ActivityLog $log) => [
'id' => $log->id,
'event' => $log->event,
'ip_address' => $log->ip_address,
'user_agent' => $log->user_agent,
'created_at' => $log->created_at?->toIso8601String(),
])->values(),
'meta' => [
'current_page' => $history->currentPage(),
'per_page' => $history->perPage(),
'total' => $history->total(),
'last_page' => $history->lastPage(),
],
]);
}
public function updatePreferences(ClientPreferencesRequest $request)
{
$customer = auth('client')->user();
$oldValues = $customer->only(['email_marketing', 'receive_deposit']);
$customer->fill($request->validated());
$dirty = $customer->getDirty();
$customer->save();
if ($dirty !== []) {
$this->activityLogger->log(
event: 'preferences_update',
logName: 'Customer',
description: "Customer {$customer->email} cập nhật tuỳ chọn tài khoản",
subject: $customer,
oldValues: array_intersect_key($oldValues, $dirty),
newValues: $dirty,
);
}
return response()->json([
'error' => false,
'message' => 'Đã lưu cài đặt tài khoản.',
'data' => ['client' => new ClientResource($customer->fresh())],
]);
}
}