ldc-supportweb/app/Http/Controllers/TicketController.php
2021-05-04 12:37:15 +02:00

222 lines
7.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Enums\TicketStatus;
use App\Enums\TicketType;
use App\Events\NotifySubscriptions;
use App\Events\TicketStatusChanged;
use App\Http\Requests\ChangeTicketStatus;
use App\Http\Requests\CreateMessage;
use App\Http\Requests\SortTickets;
use App\Http\Requests\StoreTicket;
use App\Http\Requests\UpdateTicket;
use App\Mail\NewTicket;
use App\Models\Message;
use App\Models\Project;
use App\Models\Ticket;
use App\Models\User;
use Exception;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
class TicketController extends Controller
{
public function __construct()
{
$this->authorizeResource(Ticket::class, 'ticket');
}
public function index(SortTickets $request)
{
$tickets = Ticket::query();
if (auth()->user()->project_id) {
$tickets = $tickets->where('project_id', auth()->user()->project_id);
}
if ($request->status) {
$tickets = $tickets->where('status', TicketStatus::archived());
} else {
$tickets = $tickets->where('status', '<>', TicketStatus::archived());
}
if ($request->rst) {
Session::remove('tickets.pr');
Session::remove('tickets.sort_col');
Session::remove('tickets.sort_way');
}
if ($request->prs) {
Session::remove('tickets.pr');
}
if ($request->sort_col) {
Session::put('tickets.sort_col', $request->sort_col);
Session::save();
}
if ($request->sort_way) {
Session::put('tickets.sort_way', $request->sort_way);
Session::save();
}
if ($request->pr) {
Session::put('tickets.pr', $request->pr);
Session::save();
}
if (Session::has('tickets.pr')) {
$tickets = $tickets->where('project_id', Session::get('tickets.pr'));
}
if (Session::has('tickets.sort_col') and Session::has('tickets.sort_way')) {
switch (Session::get('tickets.sort_col')) {
case 'id':
$tickets = $tickets->orderBy('id', Session::get('tickets.sort_way'));
break;
case 'project':
$tickets = $tickets->orderBy('project_id', Session::get('tickets.sort_way'));
break;
case 'created_at':
$tickets = $tickets->orderBy('created_at', Session::get('tickets.sort_way'));
break;
case 'created_by':
$tickets = $tickets->orderBy('created_by', Session::get('tickets.sort_way'));
break;
case 'type':
$tickets = $tickets->orderBy('type', Session::get('tickets.sort_way'));
break;
case 'status':
$tickets = $tickets->orderBy('status', Session::get('tickets.sort_way'));
break;
}
}
$tickets = $tickets->paginate();
$projects = Project::select('id', 'name')->get();
return view('ticket.index', compact('tickets', 'projects'));
}
public function show(Ticket $ticket)
{
$messages = $ticket->messages()->orderBy('created_at', 'DESC')->get();
$isSubscribed = (bool)$ticket->subscriptions()->where('user_id', Auth::user()->id)->count();
return view('ticket.show', compact('ticket', 'messages', 'isSubscribed'));
}
public function create()
{
$projects = Project::all();
if (!count($projects)) {
return redirect()->route('project.create')
->with('warning', 'Vous devez tout d\'abord créer un projet pour y ajouter un ticket');
}
return view('ticket.create', compact('projects'));
}
public function store(StoreTicket $request)
{
$project = Project::findOrFail($request->project_id);
$ticket = new Ticket($request->validated());
if ($request->file_ticket) {
$ticket->file = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket);
}
if ($request->file_ticket2) {
$ticket->file2 = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket2);
}
$ticket->user()->associate(auth()->user());
$ticket->save();
if (config('mail.MAIL_ADMIN')) {
Mail::to(config('mail.MAIL_ADMIN'))->send(new NewTicket($ticket));
} else {
throw new Exception('Missing MAIL_ADMIN in .env');
}
return redirect()->route('home')->with('success', 'Ticket enregistré !');
}
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
public function edit(Ticket $ticket)
{
$projects = Project::all();
return view('ticket.edit', compact('ticket', 'projects'));
}
public function update(UpdateTicket $request, Ticket $ticket)
{
$project = Project::findOrFail($request->project_id);
$ticket->fill($request->validated());
if ($request->file_ticket) {
if (File::exists($ticket->file)) {
File::delete($ticket->file);
}
$ticket->file = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket);
}
if ($request->file_ticket2) {
if (File::exists($ticket->file2)) {
File::delete($ticket->file2);
}
$ticket->file2 = Ticket::saveFile($project, $ticket, $ticket->type, $request->file_ticket2);
}
$ticket->save();
return redirect()->route('ticket.edit', $ticket->id)->with('success', 'Modifications enregistrées !');
}
public function changeStatus(ChangeTicketStatus $request, Ticket $ticket)
{
$ticket->fill($request->validated());
$ticket->save();
return back();
}
public function createMessage(CreateMessage $request, Ticket $ticket)
{
$fileMessage = $request->file_message;
$message = new Message($request->validated());
$message->user()->associate(auth()->user());
$message->ticket()->associate($ticket);
$message->save();
if ($request->file_message) {
$projectSlug = Str::slug($ticket->project->name);
$fileMessage = $request->file_message;
$fileName = $projectSlug . '-ticket-' . $ticket->id . '-message-' . $message->id . '.' . $fileMessage->extension();
$fileMessage->move(public_path('fichiers/' . $projectSlug . '/' . $ticket->id . '/'), $fileName);
$filePath = 'fichiers/' . $projectSlug . '/' . $ticket->id . '/' . $fileName;
$message->file = $filePath;
$message->save();
}
event(new NotifySubscriptions(
$message->ticket,
trans('Nouvelle réponse de :name :<br> :message', [
'name' => $message->user->name,
'message' => $message->message
])
));
return back();
}
public function setToArchive(Ticket $ticket)
{
$ticket->status = TicketStatus::archived();
$ticket->saveOrFail();
return redirect()->route('ticket.index');
}
public function subscribe(Ticket $ticket)
{
User::find(Auth::user()->id)->subscriptions()->toggle($ticket->id);
return back();
}
}