Preservar a oportunidade durante o registo e preparacao do perfil

This commit is contained in:
2026-10-30 21:22:40 +02:00
parent f5f5649cfc
commit 86b31f2840
8 changed files with 184 additions and 16 deletions
@@ -59,13 +59,20 @@ class CandidatePortalController extends Controller
public function register(Request $request, int $company, CandidateProfiles $profiles): Response
{
$selection = $request->validate(['opportunity_id' => 'nullable|integer|min:1|max:2147483647']);
$account = $profiles->register($company, $request->all());
Auth::guard('candidate')->login($account, false);
$request->session()->put('candidate.session_version', $account->session_version);
$request->session()->regenerate();
Inertia::clearHistory();
return redirect('/candidaturas/'.$company.'/perfil');
$selected = $this->rememberOpportunity($request, $account, isset($selection['opportunity_id']) ? (int) $selection['opportunity_id'] : null);
$response = redirect('/candidaturas/'.$company.'/perfil');
if (isset($selection['opportunity_id']) && $selected === null) {
$response->with('candidate_access_status', 'opportunity_unavailable');
}
return $response;
}
public function login(Request $request, int $company, CandidateProfiles $profiles): Response
@@ -85,16 +92,12 @@ class CandidatePortalController extends Controller
$request->session()->regenerate();
Inertia::clearHistory();
$selected = $this->rememberOpportunity($request, $account, isset($data['opportunity_id']) ? (int) $data['opportunity_id'] : null);
if ($selected !== null) {
return redirect('/candidaturas/'.$company.'/oportunidades/'.$selected['id']);
}
if (isset($data['opportunity_id'])) {
try {
// Recheck current publication, company and deadline after authentication.
app(CandidateSubmissions::class)->opportunity($company, (int) $data['opportunity_id']);
return redirect('/candidaturas/'.$company.'/oportunidades/'.$data['opportunity_id']);
} catch (NotFoundHttpException|ModelNotFoundException) {
// A withdrawn, expired or foreign opportunity cannot become an authenticated destination.
return redirect('/candidaturas/'.$company.'/perfil')->with('candidate_access_status', 'opportunity_unavailable');
}
return redirect('/candidaturas/'.$company.'/perfil')->with('candidate_access_status', 'opportunity_unavailable');
}
return redirect('/candidaturas/'.$company.'/perfil');
@@ -109,10 +112,13 @@ class CandidatePortalController extends Controller
$profiles->event($account, 'profile.consulted', []);
$filter = $request->validate(['opportunities_page' => 'sometimes|integer|min:1']);
$opportunities = app(CandidateSubmissions::class)->publicOpportunities($company, (int) ($filter['opportunities_page'] ?? 1))->withPath('/candidaturas/'.$company.'/perfil');
$selection = $request->session()->get('candidate.selected_opportunity');
$scopedSelection = is_array($selection) && ($selection['company'] ?? null) === $company && ($selection['account'] ?? null) === $account->id && is_int($selection['id'] ?? null) && $selection['id'] > 0;
$selected = $this->rememberOpportunity($request, $account, $scopedSelection ? (int) $selection['id'] : null);
return $this->page($request, 'candidate/profile', ['companyId' => $company, 'email' => $account->email, 'profile' => $profiles->profile($account),
'emailVerified' => $account->email_verified_at !== null, 'accessStatus' => $request->session()->get('candidate_access_status'), 'emailDeliveryAvailable' => app(CandidateAccess::class)->deliveryAvailable(),
'opportunities' => $opportunities->items(), 'opportunityPagination' => ['prev' => $opportunities->previousPageUrl(), 'next' => $opportunities->nextPageUrl()],
'emailVerified' => $account->email_verified_at !== null, 'accessStatus' => $scopedSelection && $selected === null ? 'opportunity_unavailable' : $request->session()->get('candidate_access_status'), 'emailDeliveryAvailable' => app(CandidateAccess::class)->deliveryAvailable(),
'opportunities' => $opportunities->items(), 'opportunityPagination' => ['prev' => $opportunities->previousPageUrl(), 'next' => $opportunities->nextPageUrl()], 'selectedOpportunity' => $selected,
'submissions' => Schema::hasTable('candidate_submissions') ? DB::table('candidate_submissions')->where('tenant_id', $company)->where('candidate_account_id', $account->id)->latest('id')->limit(20)->get(['id', 'reference', 'created_at']) : []]);
}
@@ -131,7 +137,7 @@ class CandidatePortalController extends Controller
abort_unless($account !== null, 401);
$profiles->event($account, 'account.logout', []);
Auth::guard('candidate')->logout();
$request->session()->forget('candidate.session_version');
$request->session()->forget(['candidate.session_version', 'candidate.selected_opportunity']);
$request->session()->regenerate();
$request->session()->regenerateToken();
Inertia::clearHistory();
@@ -139,6 +145,23 @@ class CandidatePortalController extends Controller
return redirect('/candidaturas/'.$company);
}
/** @return array{id:int,title:string}|null */
private function rememberOpportunity(Request $request, CandidateAccount $account, ?int $id): ?array
{
$request->session()->forget('candidate.selected_opportunity');
if ($id === null) {
return null;
}
try {
$opportunity = app(CandidateSubmissions::class)->opportunity($account->tenant_id, $id);
} catch (NotFoundHttpException|ModelNotFoundException) {
return null;
}
$request->session()->put('candidate.selected_opportunity', ['company' => $account->tenant_id, 'account' => $account->id, 'id' => $id]);
return ['id' => $id, 'title' => $opportunity['title']];
}
private function account(Request $request, int $company): ?CandidateAccount
{
$account = Auth::guard('candidate')->user();
@@ -205,6 +228,10 @@ class CandidatePortalController extends Controller
$account = $this->account($request, $company);
abort_unless($account !== null, 401);
$id = $submissions->submit($account, $process, $request->all());
$selection = $request->session()->get('candidate.selected_opportunity');
if (is_array($selection) && ($selection['company'] ?? null) === $company && ($selection['account'] ?? null) === $account->id && ($selection['id'] ?? null) === $process) {
$request->session()->forget('candidate.selected_opportunity');
}
return redirect('/candidaturas/'.$company.'/submissoes/'.$id);
}