refactor: exit-view and view-as routes to manage cookies directly #6

Merged
oyurchik merged 1 commits from refactor--cookies into main 2025-10-03 11:11:45 +00:00
3 changed files with 16 additions and 23 deletions
Showing only changes of commit 45bfee78fb - Show all commits

View File

@ -1,10 +1,12 @@
import { NextResponse } from 'next/server'; import { NextResponse } from 'next/server';
import { disablePilotView, requireRole } from '../../../lib/auth/session'; import { 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();
return NextResponse.redirect(new URL('/admin', request.url)); const response = NextResponse.redirect(new URL('/admin', request.url));
response.cookies.delete('alabuga_view_as');
return response;
} }

View File

@ -1,10 +1,18 @@
import { NextResponse } from 'next/server'; import { NextResponse } from 'next/server';
import { enablePilotView, requireRole } from '../../../lib/auth/session'; import { 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();
return NextResponse.redirect(new URL('/', request.url)); const response = 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,7 +47,6 @@ 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;
} }
} }
@ -94,19 +93,3 @@ 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);
}