authorizeRead('mailing'); $query = MailingList::with(['user', 'contatti', 'tags']); if ($request->filled('tag')) { $tagSlugs = (array) $request->input('tag'); $query->withAnyTags($tagSlugs); } $mailingLists = $query->orderBy('nome')->get(); $allTags = Tag::orderBy('name')->get(); return view('mailing-liste.index', compact('mailingLists', 'allTags')); } public function create() { $this->authorizeWrite('mailing'); $tags = Tag::orderBy('name')->get(); return view('mailing-liste.create', compact('tags')); } public function store(Request $request) { $this->authorizeWrite('mailing'); $data = $request->validate([ 'nome' => 'required|string|max:255', 'descrizione' => 'nullable|string', 'attiva' => 'boolean', 'contatti_json' => 'nullable|string', 'tags' => 'nullable|array', 'tags.*' => 'exists:tags,id', ]); $data['user_id'] = auth()->id(); $data['attiva'] = $data['attiva'] ?? true; $lista = MailingList::create([ 'nome' => $data['nome'], 'descrizione' => $data['descrizione'] ?? null, 'attiva' => $data['attiva'], 'user_id' => $data['user_id'], ]); if ($request->has('tags')) { $lista->tags()->sync($request->tags); } if (!empty($data['contatti_json'])) { $contatti = json_decode($data['contatti_json'], true); if (is_array($contatti)) { foreach ($contatti as $contatto) { if (!empty($contatto['individuo_id'])) { $lista->contatti()->create([ 'individuo_id' => $contatto['individuo_id'], 'opt_in' => true, 'opt_in_data' => now(), ]); } } } } return redirect()->route('mailing-liste.index')->with('success', 'Lista creata con ' . $lista->contatti()->count() . ' contatti.'); } public function show($mailing_liste) { $this->authorizeRead('mailing'); $mailingList = MailingList::with(['contatti.individuo.contatti', 'tags'])->findOrFail($mailing_liste); return view('mailing-liste.show', compact('mailingList')); } public function edit($mailingList) { $this->authorizeWrite('mailing'); $mailingList = MailingList::with(['contatti.individuo.contatti', 'tags'])->findOrFail($mailingList); $tags = Tag::orderBy('name')->get(); $selectedTags = $mailingList->tags->pluck('id')->toArray(); return view('mailing-liste.edit', compact('mailingList', 'tags', 'selectedTags')); } public function update(Request $request, $mailingList) { $this->authorizeWrite('mailing'); $mailingList = MailingList::findOrFail($mailingList); $data = $request->validate([ 'nome' => 'required|string|max:255', 'descrizione' => 'nullable|string', 'attiva' => 'boolean', 'contatti_json' => 'nullable|string', 'tags' => 'nullable|array', 'tags.*' => 'exists:tags,id', ]); $data['attiva'] = $data['attiva'] ?? false; $mailingList->update([ 'nome' => $data['nome'], 'descrizione' => $data['descrizione'] ?? null, 'attiva' => $data['attiva'], ]); if ($request->has('tags')) { $mailingList->tags()->sync($request->tags); } else { $mailingList->tags()->detach(); } if (!empty($data['contatti_json'])) { $newContatti = json_decode($data['contatti_json'], true); if (is_array($newContatti)) { $existingIds = $mailingList->contatti()->pluck('individuo_id')->toArray(); $newIds = array_column($newContatti, 'individuo_id'); $toRemove = array_diff($existingIds, $newIds); if (!empty($toRemove)) { $mailingList->contatti()->whereIn('individuo_id', $toRemove)->delete(); } $toAdd = array_diff($newIds, $existingIds); foreach ($newContatti as $contatto) { if (in_array($contatto['individuo_id'], $toAdd)) { $mailingList->contatti()->create([ 'individuo_id' => $contatto['individuo_id'], 'opt_in' => true, 'opt_in_data' => now(), ]); } } } } return redirect()->route('mailing-liste.show', $mailingList->id)->with('success', 'Lista aggiornata.'); } public function destroy($mailingList) { $this->authorizeDelete('mailing'); $mailingList = MailingList::findOrFail($mailingList); $mailingList->delete(); return redirect()->route('mailing-liste.index')->with('success', 'Lista eliminata.'); } public function massElimina(Request $request) { $this->authorizeDelete('mailing'); $ids = $request->input('ids', []); if (!is_array($ids) || empty($ids)) { return redirect()->route('mailing-liste.index')->with('error', 'Nessuna mailing list selezionata.'); } $liste = MailingList::whereIn('id', $ids)->get(); foreach ($liste as $lista) { $lista->contatti()->delete(); $lista->delete(); } return redirect()->route('mailing-liste.index')->with('success', count($liste) . ' mailing list eliminate con successo.'); } public function createFromIndividui(Request $request) { $this->authorizeWrite('mailing'); $data = $request->validate([ 'nome' => 'required|string|max:255', 'descrizione' => 'nullable|string', 'contatti' => 'required|array', 'contatti.*.individuo_id' => 'required|exists:individui,id', 'contatti.*.email' => 'required|email', ]); $lista = MailingList::create([ 'nome' => $data['nome'], 'descrizione' => $data['descrizione'] ?? null, 'attiva' => true, 'user_id' => auth()->id(), ]); foreach ($data['contatti'] as $contatto) { $lista->contatti()->create([ 'individuo_id' => $contatto['individuo_id'], 'opt_in' => true, 'opt_in_data' => now(), ]); } return response()->json(['success' => true, 'lista_id' => $lista->id]); } }