user()->tokenCan('press-releases:write'), 403); try { $validated = $request->validate([ 'company' => ['required', 'array'], 'company.name' => ['required', 'string', 'max:255'], 'company.portal' => ['nullable', Rule::enum(Portal::class)->only([Portal::Presseecho, Portal::Businessportal24])], 'company.address' => ['nullable', 'string', 'max:1000'], 'company.country_id' => ['nullable', 'integer'], 'company.phone' => ['nullable', 'string', 'max:100'], 'company.fax' => ['nullable', 'string', 'max:100'], 'company.email' => ['nullable', 'email', 'max:255', new PlausibleEmailDomain], 'company.website' => ['nullable', 'string', 'max:255'], ])['company']; } catch (ValidationException $exception) { return $this->legacyValidationError($exception); } $user = $request->user(); // Portal aus Parameter/Domain, sonst wie bisher vom User — der // User-Fallback allein ließ alle Firmen (und damit deren PMs) von // Kunden mit Keys beider Altportale im selben Portal landen. $portal = $this->resolveRequestedPortal($validated['portal'] ?? null, $user->portal); // Links gehören nicht in den Namen (17.09.2026): Einlieferer schicken // „Firma - https://…" — die URL wandert ins Website-Feld, der Name // bleibt sauber. Vor der Zuordnung, damit der bereinigte Name mit dem // ebenso bereinigten Bestand verglichen wird. $normalized = CompanyNameNormalizer::normalize($validated['name'], $validated['website'] ?? null); $validated['name'] = $normalized['name']; $validated['website'] = $normalized['website']; // Steht unter dieser Firmen-E-Mail schon dieselbe Firma, bekommt der // Aufrufer deren ID — statt je Meldung eines neuen Newsrooms // (Roadmap 1a.4). Der Vertrag bleibt: 201 + Location. $existing = $assignment->assign($user, $validated['email'] ?? null, $validated['name'], $portal); if ($existing) { return $this->legacyCreated(url("/service/users/me/companies/{$existing->id}")); } $company = new Company([ 'portal' => $portal->value, 'type' => CompanyType::Company->value, 'name' => $validated['name'], 'address' => $validated['address'] ?? null, 'country_code' => $this->legacyCountryCode($validated['country_id'] ?? null), 'phone' => $validated['phone'] ?? null, 'fax' => $validated['fax'] ?? null, 'email' => $validated['email'] ?? null, 'website' => $validated['website'] ?? null, // Alt-Verhalten: per API angelegte Firmen waren sofort nutzbar. 'is_active' => true, ]); $company->owner_user_id = $user->id; $company->slug = $company->generateUniqueSlug($company->name); $company->save(); $company->users()->attach($user->id, ['role' => 'owner']); if ($normalized['removed'] !== []) { $activityLog->record( ActivityType::Correction, sprintf('API-Firma #%d: Link aus dem Namen entfernt („%s“ → „%s“)', $company->getKey(), $request->input('company.name'), $company->name), $user, $company, ['removed' => $normalized['removed']], ); } return $this->legacyCreated(url("/service/users/me/companies/{$company->id}")); } }