HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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');
    }

}