refactor: exit-view and view-as routes to manage cookies directly #6
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user