diff --git a/app/Concerns/MustSetInitialPassword.php b/app/Concerns/MustSetInitialPassword.php index 69308cc3..30fe6707 100644 --- a/app/Concerns/MustSetInitialPassword.php +++ b/app/Concerns/MustSetInitialPassword.php @@ -34,9 +34,10 @@ public function hasSetPassword(): bool return ! \is_null($this->password_set_at); } - public function markPasswordAsSet(): bool + public function setPassword(string $password): bool { return $this->forceFill([ + 'password' => Hash::make($password), 'email_verified_at' => now(), 'password_set_at' => now(), ])->save(); diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index bafda607..69b85988 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -24,7 +24,5 @@ protected function schedule(Schedule $schedule): void protected function commands(): void { $this->load(__DIR__ . '/Commands'); - - require base_path('routes/console.php'); } } diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php index a393775f..46b538b1 100644 --- a/app/Http/Controllers/Auth/AuthenticatedSessionController.php +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -35,13 +35,8 @@ public function store(LoginRequest $request): RedirectResponse $request->authenticate(); $request->session()->regenerate(); - $redirect = RouteServiceProvider::HOME; - $redirect = match ($request->get('from', '')) { - 'championship-page' => RouteServiceProvider::CHAMPIONSHIP, - default => $redirect , - }; - return redirect()->intended($redirect); + return redirect()->intended(RouteServiceProvider::getDashboardUrl()); } /** diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php index f75634ea..aae12bd0 100644 --- a/app/Http/Controllers/Auth/ConfirmablePasswordController.php +++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -39,6 +39,6 @@ public function store(Request $request): RedirectResponse $request->session()->put('auth.password_confirmed_at', time()); - return redirect()->intended(RouteServiceProvider::HOME); + return redirect()->intended(RouteServiceProvider::getDashboardUrl()); } } diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php index 4c81e24f..52a89184 100644 --- a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php +++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -17,7 +17,7 @@ class EmailVerificationNotificationController extends Controller public function store(Request $request): RedirectResponse { if ($request->user()->hasVerifiedEmail()) { - return redirect()->intended(RouteServiceProvider::HOME); + return redirect()->intended(RouteServiceProvider::getDashboardUrl()); } $request->user()->sendEmailVerificationNotification(); diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php index 4cf88b3e..75b93c48 100644 --- a/app/Http/Controllers/Auth/EmailVerificationPromptController.php +++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -19,7 +19,7 @@ class EmailVerificationPromptController extends Controller public function __invoke(Request $request): RedirectResponse|Response { return $request->user()->hasVerifiedEmail() - ? redirect()->intended(RouteServiceProvider::HOME) + ? redirect()->intended(RouteServiceProvider::getDashboardUrl()) : Inertia::render('Auth/VerifyEmail', ['status' => session('status')]); } } diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php index fcf8773e..10c9cd21 100644 --- a/app/Http/Controllers/Auth/PasswordController.php +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -8,10 +8,8 @@ use App\Models\User; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\Http\Response; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules\Password; -use Inertia\Inertia; class PasswordController extends Controller { @@ -31,42 +29,4 @@ public function update(Request $request): RedirectResponse return back(); } - - public function setInitialPassword(User $user, Request $request): \Inertia\Response - { - if (! $request->hasValidSignature()) { - abort(Response::HTTP_FORBIDDEN, __('auth.welcome.invalid_signature')); - } - - if (\is_null($user)) { - abort(Response::HTTP_FORBIDDEN, __('auth.welcome.no_user')); - } - - if ($user->hasSetPassword()) { - abort(Response::HTTP_FORBIDDEN, __('auth.welcome.already_used')); - } - - return Inertia::render('Auth/SetInitialPassword', [ - 'user' => $user, - 'token' => sha1($user->email), - ]); - } - - public function storeInitialPassword(Request $request, User $user): RedirectResponse - { - if ($request->token !== sha1($user->email)) { - abort(401); - } - $validated = $request->validate([ - 'password' => ['required', Password::defaults(), 'confirmed'], - ]); - - $user->update([ - 'password' => Hash::make($validated['password']), - ]); - $user->markPasswordAsSet(); - - return redirect()->route('login') - ->with('success', __('user.messages.set_initial_password_success')); - } } diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php index a24c151d..d93a4a09 100644 --- a/app/Http/Controllers/Auth/VerifyEmailController.php +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -19,7 +19,7 @@ class VerifyEmailController extends Controller public function __invoke(EmailVerificationRequest $request): RedirectResponse { if ($request->user()->hasVerifiedEmail()) { - return redirect()->intended(RouteServiceProvider::HOME . '?verified=1'); + return redirect()->intended(RouteServiceProvider::getDashboardUrl() . '?verified=1'); } if ($request->user()->markEmailAsVerified()) { @@ -29,6 +29,6 @@ public function __invoke(EmailVerificationRequest $request): RedirectResponse } } - return redirect()->intended(RouteServiceProvider::HOME . '?verified=1'); + return redirect()->intended(RouteServiceProvider::getDashboardUrl() . '?verified=1'); } } diff --git a/app/Http/Controllers/Dashboard/ProjectController.php b/app/Http/Controllers/Dashboard/ProjectController.php index 81a7f578..5f622c27 100644 --- a/app/Http/Controllers/Dashboard/ProjectController.php +++ b/app/Http/Controllers/Dashboard/ProjectController.php @@ -6,7 +6,7 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Project\StoreRequest; -use App\Http\Resources\ProjectCardsResource; +use App\Http\Resources\ProjectCardResource; use App\Models\Activity; use App\Models\County; use App\Models\Project; @@ -24,7 +24,7 @@ public function index(Request $request) $projectStatus = $request->get('project_status'); return Inertia::render('AdminOng/Projects/Projects', [ - 'query' => ProjectCardsResource::collection( + 'query' => ProjectCardResource::collection( Project::query() ->where('organization_id', auth()->user()->organization_id) ->when($projectStatus, function (Builder $query, $projectStatus) { diff --git a/app/Http/Controllers/Dashboard/WelcomeController.php b/app/Http/Controllers/Dashboard/WelcomeController.php new file mode 100644 index 00000000..06c5497f --- /dev/null +++ b/app/Http/Controllers/Dashboard/WelcomeController.php @@ -0,0 +1,62 @@ +middleware(function (Request $request, Closure $next) { + abort_unless( + $request->hasValidSignature(), + Response::HTTP_FORBIDDEN, + __('auth.welcome.invalid_signature') + ); + + abort_unless( + $request->user, + Response::HTTP_FORBIDDEN, + __('auth.welcome.no_user') + ); + + abort_if( + $request->user->hasSetPassword(), + Response::HTTP_FORBIDDEN, + __('auth.welcome.already_used') + ); + + return $next($request); + }); + } + + public function create(Request $request, User $user): InertiaResponse + { + return Inertia::render('Auth/Welcome', [ + 'email' => $user->email, + ]); + } + + public function store(Request $request, User $user): RedirectResponse + { + $attributes = $request->validate([ + 'password' => ['required', 'confirmed', Password::defaults()], + ]); + + $user->setPassword($attributes['password']); + + return redirect()->route('login') + ->with('success', __('user.messages.set_initial_password_success')); + } +} diff --git a/app/Http/Controllers/EvolutionController.php b/app/Http/Controllers/EvolutionController.php index 0d41b7f5..d5ed7733 100644 --- a/app/Http/Controllers/EvolutionController.php +++ b/app/Http/Controllers/EvolutionController.php @@ -7,10 +7,11 @@ use App\Models\ActivityDomain; use App\Models\County; use Inertia\Inertia; +use Inertia\Response; class EvolutionController extends Controller { - public function index() + public function __invoke(): Response { $donations = 102030; $amount = 122345; @@ -132,7 +133,7 @@ public function index() 'first_page_url' => 'http://bursabinelui.test/articole?page=1', 'from' => 1, 'last_page' => 2, - 'last_page_url'=> 'http://bursabinelui.test/articole?page=2', + 'last_page_url' => 'http://bursabinelui.test/articole?page=2', 'links' => [ [ 'url' => 'http://bursabinelui.test/articole?page=1', @@ -140,14 +141,14 @@ public function index() 'active' => true, ], [ - 'url'=> 'http://bursabinelui.test/articole?page=2', - 'label'=> '2', - 'active'=> false, + 'url' => 'http://bursabinelui.test/articole?page=2', + 'label' => '2', + 'active' => false, ], ], - 'next_page_url'=> 'http://bursabinelui.test/articole?page=1', - 'path'=> 'http://bursabinelui.test/articole', - 'per_page' =>15, + 'next_page_url' => 'http://bursabinelui.test/articole?page=1', + 'path' => 'http://bursabinelui.test/articole', + 'per_page' => 15, 'prev_page_url' => null, 'to' => 15, 'total' => 20, diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 089bb74f..8fbb3783 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -4,8 +4,8 @@ namespace App\Http\Controllers; -use App\Http\Resources\BCRProjectCardsResource; -use App\Http\Resources\ProjectCardsResource; +use App\Http\Resources\BCRProjectCardResource; +use App\Http\Resources\ProjectCardResource; use App\Models\Article; use App\Models\Organization; use App\Models\Project; @@ -26,14 +26,14 @@ public function index() ->isApproved() ->count(), - 'projects' => ProjectCardsResource::collection( + 'projects' => ProjectCardResource::collection( Project::publish() ->inRandomOrder() ->limit(12) ->get() ), - 'bcr_projects' => BCRProjectCardsResource::collection( + 'bcr_projects' => BCRProjectCardResource::collection( Project::publish() // TODO: ->whereOrganizationIsBCR() ->limit(12) diff --git a/app/Http/Livewire/Welcome.php b/app/Http/Livewire/Welcome.php index 09d6f140..cb0f1fa4 100644 --- a/app/Http/Livewire/Welcome.php +++ b/app/Http/Livewire/Welcome.php @@ -15,7 +15,6 @@ use Illuminate\Contracts\View\View; use Illuminate\Http\Request; use Illuminate\Http\Response; -use Illuminate\Support\Facades\Hash; use Illuminate\Validation\ValidationException; use Livewire\Component; @@ -70,11 +69,7 @@ public function handle(): ?LoginResponse ]); } - $this->user->update([ - 'password' => Hash::make(data_get($this->form->getState(), 'password')), - ]); - - $this->user->markPasswordAsSet(); + $this->user->setPassword(data_get($this->form->getState(), 'password')); Filament::auth()->login($this->user); diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index e1732a38..e157bc15 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -23,7 +23,7 @@ public function handle(Request $request, Closure $next, string ...$guards): Resp foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { - return redirect(RouteServiceProvider::HOME); + return redirect(RouteServiceProvider::getDashboardUrl()); } } diff --git a/app/Http/Resources/BCRProjectCardsResource.php b/app/Http/Resources/BCRProjectCardResource.php similarity index 94% rename from app/Http/Resources/BCRProjectCardsResource.php rename to app/Http/Resources/BCRProjectCardResource.php index d9540d8d..248e7dbc 100644 --- a/app/Http/Resources/BCRProjectCardsResource.php +++ b/app/Http/Resources/BCRProjectCardResource.php @@ -8,7 +8,7 @@ use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Facades\Vite; -class BCRProjectCardsResource extends JsonResource +class BCRProjectCardResource extends JsonResource { public static $wrap = null; diff --git a/app/Http/Resources/Organizations/ShowOrganizationResource.php b/app/Http/Resources/Organizations/ShowOrganizationResource.php index a2946718..f3571bc3 100644 --- a/app/Http/Resources/Organizations/ShowOrganizationResource.php +++ b/app/Http/Resources/Organizations/ShowOrganizationResource.php @@ -4,7 +4,7 @@ namespace App\Http\Resources\Organizations; -use App\Http\Resources\ProjectCardsResource; +use App\Http\Resources\ProjectCardResource; use App\Models\Project; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; @@ -32,7 +32,7 @@ public function toArray(Request $request): array 'status' => $this->status, 'eu_platesc_merchant_id' => filled($this->eu_platesc_merchant_id), 'eu_platesc_private_key' => filled($this->eu_platesc_private_key), - 'projects' => ProjectCardsResource::collection( + 'projects' => ProjectCardResource::collection( $this->projects->map(function (Project $project) { $project->setRelation('organization', $this); diff --git a/app/Notifications/Ngo/WelcomeNotification.php b/app/Notifications/Ngo/WelcomeNotification.php index 64f52113..647b186d 100644 --- a/app/Notifications/Ngo/WelcomeNotification.php +++ b/app/Notifications/Ngo/WelcomeNotification.php @@ -37,7 +37,7 @@ public function toMail(object $notifiable): MailMessage 'app' => config('app.name'), ])) ->action(__('auth.welcome.submit'), URL::signedRoute( - 'ngo.user.welcome', + 'dashboard.auth.welcome', ['user' => $notifiable->id] )); } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 8ed14d61..3c275117 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -12,19 +12,6 @@ class RouteServiceProvider extends ServiceProvider { - /** - * The path to your application's "home" route. - * - * Typically, users are redirected here after authentication. - * - * @var string - */ - public const HOME = '/dashboard'; - - public const ONG = '/ong/organizatie'; - - public const CHAMPIONSHIP = '/campionatul-de-bine'; - /** * Define your route model bindings, pattern filters, and other route configuration. */ @@ -39,13 +26,34 @@ public function boot(): void ->prefix('api') ->group(base_path('routes/api.php')); - Route::middleware('web') - ->group(base_path('routes/web.php')); - Route::middleware(['web', 'auth', 'verified']) ->prefix('dashboard') ->name('dashboard.') ->group(base_path('routes/dashboard.php')); + + Route::middleware(config('filament.middleware.base')) + ->domain(config('filament.domain')) + ->prefix(config('filament.path')) + ->name('filament.') + ->group(base_path('routes/filament.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); }); } + + public static function getAdminUrl(): string + { + return route('filament.pages.dashboard'); + } + + public static function getDashboardUrl(): string + { + return route('dashboard.main'); + } + + public static function getChampionshipUrl(): string + { + return route('championship'); + } } diff --git a/resources/js/Components/Navbar.vue b/resources/js/Components/Navbar.vue index fd12e809..3bb84eb0 100644 --- a/resources/js/Components/Navbar.vue +++ b/resources/js/Components/Navbar.vue @@ -29,11 +29,7 @@