File: /var/www/quadcode-jobs/app/Http/Controllers/GdprController.php
<?php
namespace App\Http\Controllers;
use App\Http\Requests\DataRequest;
use App\Http\Requests\DataRequestConfirm;
use App\Jobs\SendDpoEmailJob;
use App\Models\DataRequest as DataRequestModel;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller as BaseController;
class GdprController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
protected function emptyLeadResponse(string $email): JsonResponse
{
$data = ['success' => true];
if (DataRequestModel::isLimitReached($email, DataRequestModel::TYPE_NO_DATA)) {
$data['msg'] = 'You have already made this request.';
} else {
DataRequestModel::createRequest($email, DataRequestModel::TYPE_NO_DATA);
$this->dispatch(new SendDpoEmailJob($email, 'No data held', view('emails.no-data')->render()));
}
return response()->json($data);
}
public function dataRequest(DataRequest $request): JsonResponse
{
// Валидируем reCaptcha и email
$validated = $request->validated();
$email = $validated['email'];
return $this->emptyLeadResponse($email);
}
public function dataRequestConfirm(DataRequestConfirm $request)
{
// Валидируем token
$validated = $request->validated();
$token = $validated['token'];
// Проверяем есть ли запрос с таким токеном
/** @var DataRequestModel $dataRequestModel */
$dataRequestModel = DataRequestModel::query()->where('token', $token)->first();
if (empty($dataRequestModel)) {
return view('site.request.confirm-fail');
}
return response()->download($dataRequestModel->path, 'Data.zip', ['Content-Type: application/zip']);
}
public function dataDeleteRequest(DataRequest $request): JsonResponse
{
$validated = $request->validated();
$email = $validated['email'];
return $this->emptyLeadResponse($email);
}
public function dataDeleteRequestConfirm(DataRequestConfirm $request)
{
// Валидируем token
$validated = $request->validated();
$token = $validated['token'];
// Проверяем есть ли запрос с таким токеном
/** @var DataRequestModel $dataRequestModel */
$dataRequestModel = DataRequestModel::query()->where('token', $token)->first();
if (empty($dataRequestModel)) {
return view('site.request.confirm-fail');
}
// Очищаем персональные данные во всех лидах
$email = strtolower($dataRequestModel->email);
$dataRequestModel->delete();
/** @var Collection $dataRequests */
$dataRequests = DataRequestModel::query()->whereRaw('LOWER(email) = \'' . strtolower($email) . '\'')->get();
foreach ($dataRequests as $dataRequest) {
$dataRequest->clear();
}
$this->dispatch(new SendDpoEmailJob($email, 'Data deletion request fulfilled', view('emails.data-delete-request-confirmed')->render()));
return view('site.request.confirm-success');
}
}