validated(); $query = LotterySetting::query()->orderBy('setting_key'); if (! empty($validated['group'])) { $query->where('group_name', $validated['group']); } $items = $query->get()->map(fn (LotterySetting $s): array => [ 'key' => $s->setting_key, 'value' => $s->value_json, 'group' => $s->group_name, 'description' => $s->description_zh, ]); return ApiResponse::success(['items' => $items]); } public function update(AdminSettingUpdateRequest $request, string $key): JsonResponse { $setting = LotterySetting::query()->where('setting_key', $key)->first(); LotterySettings::put( $key, $request->validated('value'), $setting ? $setting->group_name : (explode('.', $key)[0] ?? 'general'), $setting ? $setting->description_zh : null, ); $fresh = LotterySetting::query()->where('setting_key', $key)->first(); return ApiResponse::success([ 'key' => $fresh->setting_key, 'value' => $fresh->value_json, 'group' => $fresh->group_name, 'description' => $fresh->description_zh, ]); } public function batchUpdate(AdminSettingBatchUpdateRequest $request): JsonResponse { /** @var list $items */ $items = $request->validated('items'); DB::transaction(static function () use ($items): void { LotterySettings::putMany($items); }); $keys = array_map(static fn (array $item): string => (string) $item['key'], $items); $rows = LotterySetting::query() ->whereIn('setting_key', $keys) ->orderBy('setting_key') ->get(); $admin = $request->lotteryAdmin(); if ($admin !== null) { AuditLogger::recordForAdmin( $admin, $request, moduleCode: 'settings', actionCode: 'batch_update', targetType: 'lottery_settings', targetId: 'batch', beforeJson: null, afterJson: [ 'keys' => $keys, 'count' => count($keys), ], ); $request->attributes->set(RecordAdminApiAudit::ATTRIBUTE_AUDIT_RECORDED, true); } return ApiResponse::success([ 'items' => $rows->map(fn (LotterySetting $s): array => [ 'key' => $s->setting_key, 'value' => $s->value_json, 'group' => $s->group_name, 'description' => $s->description_zh, ])->values()->all(), ]); } }