service->list( $request->validated(), $request->user() ); return $this->successPaginated( $data, TenantResource::class, 'Data Tenant berhasil diambil' ); } public function store(StoreTenantRequest $request) { $data = $this->service->create( $request->validated() ); return $this->created( new TenantResource($data), 'Tenant berhasil dibuat' ); } public function show(Request $request, Tenant $tenant) { $this->authorizeTenantAccess($request, $tenant); return $this->success( new TenantResource($tenant), 'Detail Tenant berhasil diambil' ); } public function update( UpdateTenantRequest $request, Tenant $tenant ) { $data = $this->service->update( $tenant, $request->validated() ); return $this->updated( new TenantResource($data), 'Tenant berhasil diupdate' ); } public function destroy(Tenant $tenant) { $this->service->delete($tenant); return $this->deleted( 'Tenant berhasil dihapus' ); } private function authorizeTenantAccess(Request $request, Tenant $tenant): void { $user = $request->user(); if ($user->isMasterAdmin()) { return; } abort_unless( $user->userTenants()->where('tenant_id', $tenant->id)->exists(), 403 ); } public function installationSetting(Request $request, Tenant $tenant) { $this->authorizeTenantAccess($request, $tenant); $setting = TenantInstallationSetting::firstOrCreate(['tenant_id' => $tenant->id], ['activation_mode' => 'list_order']); return $this->success([ ...$setting->toArray(), 'tenant' => new TenantResource($tenant), 'ocr_api_key_configured' => filled($setting->ocr_api_key), 'can_manage_ocr' => $request->user()->isMasterAdmin(), ]); } public function updateInstallationSetting(Request $request, Tenant $tenant) { $this->authorizeTenantAccess($request, $tenant); $rules = ['activation_mode' => ['required', Rule::in(['list_order', 'ticket'])]]; if ($request->user()->isMasterAdmin()) { $rules += [ 'ktp_ocr_enabled' => ['required', 'boolean'], 'ocr_provider' => ['nullable', 'required_if:ktp_ocr_enabled,true', Rule::in(['gemini', 'openai'])], 'ocr_api_key' => ['nullable', 'string', 'max:4096'], 'clear_ocr_api_key' => ['nullable', 'boolean'], ]; } $data = $request->validate($rules); $setting = TenantInstallationSetting::firstOrCreate(['tenant_id' => $tenant->id], ['activation_mode' => 'list_order']); if ($request->user()->isMasterAdmin()) { if (! empty($data['clear_ocr_api_key'])) $data['ocr_api_key'] = null; elseif (blank($data['ocr_api_key'] ?? null)) unset($data['ocr_api_key']); unset($data['clear_ocr_api_key']); } $setting->update($data); return $this->updated([ ...$setting->fresh()->toArray(), 'ocr_api_key_configured' => filled($setting->fresh()->ocr_api_key), 'can_manage_ocr' => $request->user()->isMasterAdmin(), ], 'Setting tenant berhasil disimpan'); } }