Compare commits

..

No commits in common. "27dafa1c34d4260ff8ce1c5b6a6599f64f8e1236" and "b7c1eb8bb7a401c98b8c91e5c60105002a8b517c" have entirely different histories.

3 changed files with 23 additions and 16 deletions

View File

@ -1,12 +1,10 @@
import { NextResponse } from 'next/server'; import { NextResponse } from 'next/server';
import { requireRole } from '../../../lib/auth/session'; import { disablePilotView, requireRole } from '../../../lib/auth/session';
export async function GET(request: Request) { export async function GET(request: Request) {
// Возвращаем HR к своему интерфейсу. // Возвращаем HR к своему интерфейсу.
// Cookie `alabuga_view_as` хранит флаг режима просмотра, удаляем его и редиректим в админку. // Cookie `alabuga_view_as` хранит флаг режима просмотра, удаляем его и редиректим в админку.
await requireRole('hr'); await requireRole('hr');
disablePilotView();
const response = NextResponse.redirect(new URL('/admin', request.url)); return NextResponse.redirect(new URL('/admin', request.url));
response.cookies.delete('alabuga_view_as');
return response;
} }

View File

@ -1,18 +1,10 @@
import { NextResponse } from 'next/server'; import { NextResponse } from 'next/server';
import { requireRole } from '../../../lib/auth/session'; import { enablePilotView, requireRole } from '../../../lib/auth/session';
export async function GET(request: Request) { export async function GET(request: Request) {
// Доступно только HR: включаем режим просмотра и отправляем на дашборд кандидата. // Доступно только HR: включаем режим просмотра и отправляем на дашборд кандидата.
// Благодаря этому HR увидит интерфейс пилота без необходимости заводить отдельную учётку. // Благодаря этому HR увидит интерфейс пилота без необходимости заводить отдельную учётку.
await requireRole('hr'); await requireRole('hr');
enablePilotView();
const response = NextResponse.redirect(new URL('/', request.url)); return NextResponse.redirect(new URL('/', request.url));
response.cookies.set('alabuga_view_as', 'pilot', {
httpOnly: true,
sameSite: 'lax',
secure: process.env.NODE_ENV === 'production',
path: '/',
maxAge: 60 * 60,
});
return response;
} }

View File

@ -47,6 +47,7 @@ export async function getSession(): Promise<SessionPayload | null> {
return { ...session, viewAsPilot }; return { ...session, viewAsPilot };
} catch (error) { } catch (error) {
console.warn('Session validation failed:', error); console.warn('Session validation failed:', error);
store.delete(SESSION_COOKIE);
return null; return null;
} }
} }
@ -93,3 +94,19 @@ export function destroySession() {
store.delete(SESSION_COOKIE); store.delete(SESSION_COOKIE);
store.delete(VIEW_COOKIE); store.delete(VIEW_COOKIE);
} }
export function enablePilotView(): void {
// HR включает режим просмотра интерфейса пилота, чтобы видеть клиентские экраны.
cookies().set(VIEW_COOKIE, 'pilot', {
httpOnly: true,
sameSite: 'lax',
secure: process.env.NODE_ENV === 'production',
path: '/',
maxAge: 60 * 60,
});
}
export function disablePilotView(): void {
// Возвращаем интерфейс HR к обычному виду.
cookies().delete(VIEW_COOKIE);
}