AdminController.php 12.5 KB
<?php

namespace App\Http\Controllers\Admin;

use App\Classes\Tools;
use App\Http\Controllers\Controller;
use App\Http\Requests\CompanyRequest;
use App\Models\Company;
use App\Models\Employer;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class AdminController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        //
    }

    public function register() {
       $code_emp = Tools::generator_id(10);
       return view('admin.register', compact('code_emp'));
    }

    public function create(Request $request) {

        $params = $request->all();
        unset($params['code_emp']);
        $rules = [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ];

        $messages = [
            'required' => 'Укажите обязательное поле «:attribute»',
            'confirmed' => 'Пароли не совпадают',
            'email' => 'Введите корректный email',
            'unique' => 'Данный email занят уже',
            'min' => [
                'string' => 'Поле «:attribute» должно быть не меньше :min символов',
                'file' => 'Файл «:attribute» должен быть не меньше :min Кбайт'
            ],
            'max' => [
                'string' => 'Поле «:attribute» должно быть не больше :max символов',
                'file' => 'Файл «:attribute» должен быть не больше :max Кбайт'
            ],
        ];

        $validator = Validator::make($params, $rules, $messages);

        if ($validator->fails()) {
            return back()->withErrors($validator)->withInput();

        } else {
            try {
                $user = User::create([
                            'name' => $request->name,
                            'email' => $request->email,
                            'password' => Hash::make($request->password),
                            'pubpassword' => base64_encode($request->password),
                            'admin' => '1',
                            'is_worker' => '0',
                            'email_verified_at' => Carbon::now()
                ]);
            } finally {
                $emp = Employer::create([
                    'name_company' => 'Администратор',
                    'user_id' => $user->id,
                    'code' => $request->code_emp
                ]);
            }
            return redirect()->route('admin.login')
                ->with('success', 'Вы успешно зарегистрировались');
        }
    }

    public function login() {
       return view('admin.login');
    }

    // Аутентификация
    public function autenticate(Request $request) {
        //$request->validate(
        $rules = [
            'email' => 'required|string|email',
            'password' => 'required|string',
        ];

        $messages = [
            'required' => 'Укажите обязательное поле «:attribute»',
            'email' => 'Введите корректный email',
            'min' => [
                'string' => 'Поле «:attribute» должно быть не меньше :min символов',
                'file' => 'Файл «:attribute» должен быть не меньше :min Кбайт'
            ],
            'max' => [
                'string' => 'Поле «:attribute» должно быть не больше :max символов',
                'file' => 'Файл «:attribute» должен быть не больше :max Кбайт'
            ],
        ];


        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return back()->withErrors($validator)->withInput();

        } else {

            $credentials = $request->only('email', 'password');

            if (Auth::attempt($credentials, $request->has('remember'))) {

                if (is_null(Auth::user()->email_verified_at)) {
                    Auth::logout();
                    return back()->withErrors('Адрес почты не подтвержден')->withInput();
                }

                if (!Auth::user()->admin) {
                    Auth::logout();
                    return //redirect()->route('admin.login')
                        back()->withErrors('Вы не являетесь админом!')->withInput();;

                }

                return redirect()
                    ->route('admin.index')
                    ->with('success', 'Вы вошли в личный кабинет.');
            }
        }

        return redirect()
            ->route('admin.login')
            ->withErrors('Неверный логин или пароль!')->withInput();

    }

    public function logout() {
        Auth::logout();
        return redirect()->route('index')
            ->with('success', 'Вы вышли из личного кабинета');
    }

    public function index() {
        $all_user = User::query()->count();
        $all_employer = User::where('is_worker', '0')->count();
        $all_worker = User::where('is_worker', '1')->count();
        $all_admin = User::where('admin', '1')->count();
        return view('admin.index', compact('all_employer', 'all_user', 'all_worker', 'all_admin'));
    }

    public function index_admin(Request $request) {
        $title = 'Админка - Администраторы системы';
        $id_admin = Auth::user()->id;

        if ($request->ajax()) {
            $user = User::find($request->id);
            $request->offsetUnset('id');
            $user->update($request->all());
        }
        $find_key = '';
        $users = User::where('admin', '1');
        if (isset($request->find)) {
            $find_key = $request->find;
            $users = $users->where(function($query) use($find_key) {
                $query->Where('name', 'LIKE', "%$find_key%")
                    ->orWhere('email', 'LIKE', "%$find_key%");
            });
        }
        $users = $users->paginate(15);

        if ($request->ajax()) {
            return view('admin.users.index_ajax', compact('users', 'id_admin'));
        } else {
            return view('admin.users.index', compact('users', 'title', 'id_admin', 'find_key'));
        }
    }

    //Страница профиль пользователя - форма
    public function profile_user(User $user) {
        $visible = false;
        if($user->is_worker) {
            $caption = "Карточка работника";
            if (isset($user->workers[0]->id)) {
                $link = route('admin.worker-profile-edit', ['worker' => $user->workers[0]->id]);
                $visible = true;
            } else {
                $link = "";
            }

        } else {
            $caption = "Карточка работодателя";
            if (isset($user->employers[0]->id)) {

                $link = route('admin.employer-profile', ['employer' => $user->employers[0]->id]);
                $visible = true;
            } else {
                $link = "";
            }
        }

       return view('admin.users.profile', compact('user', 'visible', 'link', 'caption'));
    }

    //Страница профиль пользователя - сохранение формы
    public function store_profile_user(User $user, Request $request) {
        $rules = [
            'name' => 'required|min:3',
        ];
        $messages = [
            'required' => 'Укажите обязательное поле',
            'email' => 'Это поле должно быть определено, как Email'
        ];
        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return redirect()->route('admin.user-profile', ['user' => $user->id])
                ->withErrors($validator);
        } else {
            $user->update($request->all());
            return redirect()->route('admin.user-profile', ['user' => $user->id])
                ->with('success', 'Данные были успешно сохранены');
        }
        return redirect()->route('admin.user-profile', ['user' => $user->id]);
    }

    // Страница профиль админа - форма
    public function profile() {
        $id = Auth::user()->id;
        $user = User::find($id);

        return view('admin.profile', compact('user'));
    }

    // Страница профиль админа - сохранение формы
    public function store_profile(Request $request) {
        $id = Auth::user()->id;
        $user = User::find($id);

        $rules = [
            'name' => 'required|min:3',
            'email' => 'required|email|min:3',
        ];
        $messages = [
            'required' => 'Укажите обязательное поле',
            'email' => 'Это поле должно быть определено, как Email'
        ];
        $validator = Validator::make($request->all(), $rules, $messages);

        if ($validator->fails()) {
            return redirect()->route('admin.profile')
                ->withErrors($validator);
        } else {
            $user->update($request->all());
            return redirect()->route('admin.profile')
                ->with('success', 'Данные были успешно сохранены');
        }
        return redirect()->route('admin.profile');
    }

    // Форма смены пароля администоратора
    public function profile_password() {
        $id = Auth::user()->id;
        $user = User::find($id);
        $username = $user->name;

        return view('admin.password', compact('username'));
    }

    // Сохранение формы смены пароля администоратора
    public function profile_password_new(Request $request) {

        $rules = [
            'old_password' => 'required|min:6', //|current_password:api',
            'password' => 'required|min:6|confirmed',
        ];
        $messages = [
            'required' => 'Укажите обязательное поле',
            'confirmed' => 'Пароли не совпадают'
        ];

        $validator = Validator::make($request->all(), $rules, $messages);

        if (! Hash::check($request->old_password, $request->user()->password)) {
            return back()->withErrors([
                'old_password' => ['Неверный предыдущий пароль']
            ]);
        }

        if ($validator->fails()) {
            return redirect()->route('admin.password')
                ->withErrors($validator);
        } else {
            $params = $request->all();
            // устанавливаем новый пароль для пользователя
            User::where('id', Auth::id())
                ->update(['password' => Hash::make($request->password)]);
            session()->flash('success', 'Успешно изменен пароль!');

            return redirect()->route('admin.password');
        }
    }

    // Страница конфигурация сайта - форма
    public function config_form() {
        $config = Company::find(1);
        return view('admin.config', compact('config'));
    }

    // Страница конфигурация сайта - сохранение формы
    public function store_config(CompanyRequest $request) {
        $config = Company::find(1);

        $params = $request->all();
        unset($params['logo']);
        unset($params['image']);

        if ($request->has('logo')) {
            Storage::delete($config->logo);
            $params['logo'] = $request->file('logo')->store('config', 'public');
        }

        if ($request->has('image')) {
            Storage::delete($config->image);
            $params['image'] = $request->file('image')->store('config', 'public');
        }

            if (is_null($config)) {
                Company::create($params);
            } else {
                $config->update($params);
            }

        return redirect()->route('admin.config');
    }


}