davide-casiraghi/ci-global-calendar

View on GitHub
app/Http/Controllers/Auth/RegisterController.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Mail\UserActivation;
use App\Mail\UserActivationConfirmation;
use App\PostTranslation;
use App\User;
use DavideCasiraghi\LaravelEventsCalendar\Models\Country;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
use Validator;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/';

    // **********************************************************************

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('activateUserFromBackend');
    }

    // **********************************************************************

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'country_id' => $data['country_id'],
            'description' => $data['description'],
            'accept_terms' => 'accepted',
        ]);
    }

    // **********************************************************************

    /**
     * Show the application registration form. - OVERRIDE to default function.
     *
     * @return \Illuminate\View\View
     */
    public function showRegistrationForm()
    {
        $countries = Country::getCountries();

        return view('auth.register', compact('countries'));
    }

    // **********************************************************************

    /**
     * Register new account. - OVERRIDE to default function.
     *
     * @param  Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    protected function register(Request $request)
    {
        /** @var User $user */

        // Validate form datas
        $rules = [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
            'country_id' => 'required|integer',
            'description' => 'required',
            'accept_terms' => 'required',
            //'g-recaptcha-response' => 'required|captcha',
            'recaptcha_sum_1' => [
                'required',
                Rule::in([$request->random_number_1 + $request->random_number_2]),
            ],
        ];

        $messages = [
            'recaptcha_sum_1.required' => 'Please solve the sum',
            'recaptcha_sum_1.in' => 'Your answer is not correct',
        ];

        $validator = Validator::make($request->all(), $rules, $messages);
        if ($validator->fails()) {
            return back()->withErrors($validator)->withInput();
        }

        try {
            $validatedData = $request->all();
            $validatedData['password'] = bcrypt($validatedData['password']);
            $validatedData['activation_code'] = Str::random(30).time();
            $validatedData['country_id'] = $request->country_id;
            $validatedData['description'] = $request->description;
            $validatedData['accept_terms'] = ($request->accept_terms == 'on') ? 1 : 0;

            // Create user
            $user = app(User::class)->create($validatedData);
        } catch (\Exception $exception) {
            logger()->error($exception);

            return redirect()->back()->with('message', 'Unable to create new user.');
        }

        $countries = Country::getCountries();

        $mailDatas = [];
        $mailDatas['subject'] = 'New user registration';
        $mailDatas['name'] = $request->name;
        $mailDatas['email'] = $request->email;
        $mailDatas['country'] = $countries[$request->country_id];
        $mailDatas['description'] = $request->description;
        $mailDatas['activation_code'] = $validatedData['activation_code'];

        Mail::to(env('ADMIN_MAIL'))->send(new UserActivation($mailDatas));

        return redirect()->back()->with('message', __('auth.successfully_registered'));
    }

    // **********************************************************************

    /**
     * Activate the user with given activation code.
     *
     * @param  string  $activationCode
     * @return \Illuminate\Http\RedirectResponse|string
     */
    public function activateUser(string $activationCode)
    {
        try {
            $user = app(User::class)->where('activation_code', $activationCode)->first();
            if (! $user) {
                return 'The code does not exist for any user in our system.';
            }
            $user->status = 1;
            $user->activation_code = null;
            $user->save();
            //auth()->login($user);

            // Get welcome message text
            //$locale = App::getLocale();
            $locale = 'en';
            $message = PostTranslation::where('title', 'Welcome email')
                ->where('locale', $locale)
                ->first();

            // Send to the user the confirmation about the activation of the account
            $mailDatas = [];
            $mailDatas['senderEmail'] = 'noreply@globalcicalendar.com';
            $mailDatas['senderName'] = 'Global CI - Administrator';
            $mailDatas['subject'] = 'Activation of your Global CI account';
            $mailDatas['emailTo'] = $user->email;
            $mailDatas['name'] = $user->name;
            $mailDatas['body'] = $message->body ?? null;

            Mail::to($user->email)->send(new UserActivationConfirmation($mailDatas));
        } catch (\Exception $exception) {
            logger()->error($exception);

            return 'Whoops! something went wrong.';
        }

        return redirect()->to('/')->with('message', 'User succesfuly activated');
    }

    // **********************************************************************

    /**
     * Activate the user from the backend clicking on the Enable button in the user index view.
     *
     * @param  string  $userId
     * @return \Illuminate\Http\RedirectResponse|string
     */
    public function activateUserFromBackend(string $userId)
    {
        try {
            $user = app(User::class)->where('id', $userId)->first();
            if (! $user) {
                return 'The code user id not exist for any user in our system.';
            }
            $user->status = 1;
            $user->save();

            // Get welcome message text
            //$locale = App::getLocale();
            $locale = 'en';
            $message = PostTranslation::where('title', 'Welcome email')
                ->where('locale', $locale)
                ->first();

            // Send to the user the confirmation about the activation of the account
            $mailDatas = [];
            $mailDatas['senderEmail'] = 'noreply@globalcicalendar.com';
            $mailDatas['senderName'] = 'Global CI - Administrator';
            $mailDatas['subject'] = 'Activation of your Global CI account';
            $mailDatas['emailTo'] = $user->email;
            $mailDatas['name'] = $user->name;
            $mailDatas['body'] = $message->body ?? null;

            Mail::to($user->email)->send(new UserActivationConfirmation($mailDatas));
        } catch (\Exception $exception) {
            logger()->error($exception);

            return 'Whoops! something went wrong.';
        }

        return redirect()->to('/')->with('message', 'User succesfuly activated');
    }

    // **********************************************************************

    /**
     * Send the User activation mail to the Admin.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function userActivationMailSend(Request $request)
    {
        $report = [];

        $report['senderEmail'] = 'noreply@globalcicalendar.com';
        $report['senderName'] = 'Anonymus User';
        $report['subject'] = 'New user registration';
        $report['emailTo'] = env('ADMIN_MAIL');

        $report['name'] = $request->name;
        $report['email'] = $request->email;
        $report['message'] = $request->message;

        Mail::to($report['emailTo'])->send(new UserActivation($report));

        return redirect()->route('forms.contactform-thankyou');
    }
}