Strimoid/Strimoid

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

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Strimoid\Http\Controllers\Auth;

use Illuminate\Http\Request;
use Illuminate\Mail\Message;
use Illuminate\Support\Str;
use Strimoid\Http\Controllers\BaseController;
use Strimoid\Models\User;

class RegistrationController extends BaseController
{
    public function __construct(private readonly \Illuminate\Contracts\View\Factory $viewFactory, private readonly \Illuminate\Cache\CacheManager $cacheManager, private readonly \Illuminate\Mail\Mailer $mailer, private readonly \Illuminate\Routing\Redirector $redirector, private readonly \Illuminate\Contracts\Auth\Guard $guard, private readonly \Illuminate\Contracts\Config\Repository $configRepository)
    {
    }
    public function showRegisterForm()
    {
        return $this->viewFactory->make('user.register');
    }

    public function processRegistration(Request $request)
    {
        $this->validate($request, [
            'username' => 'required|min:2|max:30|unique:users,name|regex:/^[a-zA-Z0-9_]+$/i',
            'password' => 'required|min:6',
            'email' => 'required|email|unique_email:users|real_email',
        ]);

        $ipHash = md5((string) $request->getClientIp());

        if ($this->cacheManager->has('registration.' . $ipHash)) {
            abort(500);
        }

        $user = new User();
        $user->name = $request->input('username');
        $user->password = $request->input('password');
        $user->email = $request->input('email');
        $user->last_ip = $request->getClientIp();
        $user->activation_token = Str::random(16);
        $user->save();

        $this->mailer->send('emails.auth.activate', compact('user'), function (Message $message) use ($user): void {
            $message->to($user->email, $user->name)->subject('Witaj na Strm.pl!');
        });

        return $this->redirector->to('')->with(
            'success_msg',
            'Aby zakończyć rejestrację musisz jeszcze aktywować swoje konto, ' .
            'klikając na link przesłany na twój adres email.'
        );
    }

    public function activateAccount(Request $request, $token)
    {
        $user = User::where('activation_token', $token)->firstOrFail();

        $ipHash = md5((string) $request->getClientIp());
        if ($this->cacheManager->has('registration.' . $ipHash)) {
            abort(500);
        }

        $user->is_activated = true;
        $user->save();

        $this->guard->login($user);

        $this->cacheManager->put('registration.' . $ipHash, 'true', now()->addWeek());

        return $this->redirector->to('/kreator')->with(
            'success_msg',
            'Witaj w gronie użytkowników serwisu ' . $this->configRepository->get('app.name') . '! ;) ' .
            'Zacznij od zasubskrybowania grup pasujących do twoich zainteresowań.'
        );
    }
}