Files
RelaisSMS/app/Http/Controllers/ContactGroupController.php

118 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Contact;
use App\Models\ContactGroup;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
class ContactGroupController extends Controller
{
public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255', Rule::unique('contact_groups', 'name')->whereNull('deleted_at')],
'description' => ['nullable', 'string'],
]);
ContactGroup::query()->create([
'source' => 'local',
'name' => $validated['name'],
'slug' => $this->uniqueSlug($validated['name']),
'description' => $validated['description'] ?? null,
'is_favorite' => $request->boolean('is_favorite'),
]);
return redirect()
->route('contacts.index')
->with('status', 'Groupe cree.');
}
public function edit(ContactGroup $contactGroup): View
{
$this->ensureLocalGroup($contactGroup);
return view('contact-groups.edit', [
'group' => $contactGroup->load('contacts')->loadCount('contacts'),
'contacts' => Contact::query()
->with('phoneNumbers')
->orderBy('last_name')
->orderBy('first_name')
->get(),
'selectedContactIds' => $contactGroup->contacts->pluck('id')->all(),
]);
}
public function update(Request $request, ContactGroup $contactGroup): RedirectResponse
{
$this->ensureLocalGroup($contactGroup);
$validated = $request->validate([
'name' => [
'required',
'string',
'max:255',
Rule::unique('contact_groups', 'name')->ignore($contactGroup)->whereNull('deleted_at'),
],
'description' => ['nullable', 'string'],
'contact_ids' => ['array'],
'contact_ids.*' => [Rule::exists('contacts', 'id')->whereNull('deleted_at')],
]);
$contactGroup->update([
'name' => $validated['name'],
'slug' => $this->uniqueSlug($validated['name'], $contactGroup),
'description' => $validated['description'] ?? null,
'is_favorite' => $request->boolean('is_favorite'),
]);
if ($request->has('members_submitted')) {
$contactGroup->contacts()->sync($validated['contact_ids'] ?? []);
}
return redirect()
->route('contacts.index', ['group' => $contactGroup->id])
->with('status', 'Groupe modifie.');
}
public function destroy(ContactGroup $contactGroup): RedirectResponse
{
$this->ensureLocalGroup($contactGroup);
$contactGroup->contacts()->detach();
$contactGroup->delete();
return redirect()
->route('contacts.index')
->with('status', 'Groupe supprime.');
}
private function uniqueSlug(string $name, ?ContactGroup $ignore = null): string
{
$baseSlug = Str::slug($name);
$baseSlug = $baseSlug === '' ? 'groupe' : $baseSlug;
$slug = $baseSlug;
$index = 2;
while (ContactGroup::query()
->where('slug', $slug)
->when($ignore, fn ($query) => $query->whereKeyNot($ignore->id))
->exists()
) {
$slug = $baseSlug.'-'.$index;
$index++;
}
return $slug;
}
private function ensureLocalGroup(ContactGroup $contactGroup): void
{
abort_if($contactGroup->source !== 'local', 403, 'Les groupes importes ne sont pas modifiables localement.');
}
}