$settings 복호화된 설정 * @return array 마스킹된 설정 */ private function maskSensitive(string $identifier, array $settings): array { $plugin = $this->pluginManager->getPlugin($identifier); return $plugin === null ? $settings : SensitiveSettingMask::apply($settings, $plugin->getSettingsSchema()); } /** * 플러그인 설정을 조회합니다. * * @param string $identifier 플러그인 식별자 * @return JsonResponse 설정 데이터 */ public function show(string $identifier): JsonResponse { $settings = $this->pluginSettingsService->get($identifier); if ($settings === null) { return $this->notFound('plugins.not_found'); } return $this->success('messages.success', $this->maskSensitive($identifier, $settings)); } /** * 플러그인 설정을 업데이트합니다. * * @param UpdatePluginSettingsRequest $request 검증된 요청 * @param string $identifier 플러그인 식별자 * @return JsonResponse 업데이트 결과 */ public function update(UpdatePluginSettingsRequest $request, string $identifier): JsonResponse { // 검증을 통과한 필드만 저장한다. 과거에는 validated() 가 비면 all() 로 폴백했으나, // 그 명분이던 "PluginManager 미등록 플러그인" 은 PluginSettingsService::save() 가 // 이미 false 로 차단하므로 도달할 수 없었고, 실제로는 설정 스키마 밖의 키가 // 그대로 설정 파일에 병합되는 경로로만 동작했다 (mass-assignment). $settings = $request->validated(); $result = $this->pluginSettingsService->save($identifier, $settings); if (! $result) { return $this->error('plugins.settings.update_failed', 500); } return $this->success( 'plugins.settings.updated', $this->maskSensitive($identifier, $this->pluginSettingsService->get($identifier) ?? []) ); } /** * 플러그인 설정 레이아웃을 조회합니다. * * 설정 페이지 UI 구성과 설정 스키마를 반환합니다. * * @param string $identifier 플러그인 식별자 * @return JsonResponse 레이아웃 데이터 */ public function layout(string $identifier): JsonResponse { $layout = $this->pluginSettingsService->getLayout($identifier); if ($layout === null) { return $this->notFound('plugins.not_found'); } return $this->success('messages.success', $layout); } }