Preservar a oportunidade durante o registo e preparacao do perfil
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user