wasChanged('email')) { $this->contactAccess->syncMembershipsForEmail($model); } return; } $relevant = $model instanceof Contact ? ['email', 'company_id'] : ['email']; if (! $model->wasChanged($relevant)) { return; } $this->resync( emails: [$model->getOriginal('email'), $model->getAttribute('email')], companyIds: $this->companyIdsOf($model, withOriginal: true), ); } public function deleted(Model $model): void { if ($model instanceof User) { return; } $this->resync([$model->getAttribute('email')], $this->companyIdsOf($model)); } public function restored(Model $model): void { $this->deleted($model); } /** * @return list */ private function companyIdsOf(Company|Contact|Model $model, bool $withOriginal = false): array { $ids = $model instanceof Contact ? [$model->getAttribute('company_id'), $withOriginal ? $model->getOriginal('company_id') : null] : [$model->getKey()]; return array_values(array_unique(array_map('intval', array_filter($ids)))); } /** * Alle User, deren automatische Rechte an den betroffenen Firmen hängen, * sowie alle User mit einer der betroffenen Adressen. * * @param list $emails * @param list $companyIds */ private function resync(array $emails, array $companyIds): void { $userIds = $companyIds === [] ? collect() : DB::table('company_user') ->whereIn('company_id', $companyIds) ->whereIn('granted_via', ['auto', 'auto-upgrade']) ->pluck('user_id'); /** @var Collection $users */ $users = User::query()->whereIn('id', $userIds->all())->get(); foreach (array_unique(array_filter(array_map( fn (?string $email): string => mb_strtolower(trim((string) $email)), $emails, ))) as $email) { $users = $users->merge(EmailQuery::whereEmail(User::query(), $email)->get()); } $users->unique('id')->each(fn (User $user) => $this->contactAccess->syncMembershipsForEmail($user)); } }