Oliver-ai-bot_2.0/frontend/lib/auth.ts
Vadym Samoilenko 273507577c feat: SharePoint import, M365 token fix, region-based RAG filtering
- SharePoint browse/import: new delegated endpoints (/admin/knowledge/sharepoint/*)
  using X-MS-Token header; file picker UI in admin Knowledge Base tab
- Fix M365 Graph tokens: replace MSAL ConfidentialClientApplication with raw httpx
  refresh (no client_secret, public client PKCE flow)
- Store Graph access+refresh tokens at login when ms_refresh_token provided
- Expand OAuth scopes: offline_access, Files.Read, Sites.Read.All,
  Calendars.ReadWrite, Mail.ReadWrite, Tasks.ReadWrite
- Region-based RAG: capture usageLocation from MS Graph /me, derive region_code
  via REGION_MAP, persist on User model; pass to RAG retriever at query time
- Fix Qdrant region filter: OR condition (matching region OR no region) so global
  docs always surface for all users
- Migration 013: add region_code VARCHAR(20) column + index to users table

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-05 20:13:54 +00:00

51 lines
1.6 KiB
TypeScript

import apiClient from './api-client';
import type { LoginResponse, User } from '@/types';
export async function loginWithMicrosoft(msAccessToken: string, msRefreshToken?: string): Promise<User> {
const data = await apiClient.post<LoginResponse>('/auth/login', {
ms_access_token: msAccessToken,
ms_refresh_token: msRefreshToken,
});
if (typeof window !== 'undefined') {
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('refresh_token', data.refresh_token);
localStorage.setItem('user', JSON.stringify(data.user));
}
return data.user;
}
export async function loginDev(
email: string,
role: string,
displayName?: string
): Promise<User> {
const data = await apiClient.post<LoginResponse>('/auth/login/dev', {
email,
role,
display_name: displayName,
});
if (typeof window !== 'undefined') {
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('refresh_token', data.refresh_token);
localStorage.setItem('user', JSON.stringify(data.user));
}
return data.user;
}
export async function refreshAccessToken(): Promise<string | null> {
const refreshToken =
typeof window !== 'undefined' ? localStorage.getItem('refresh_token') : null;
if (!refreshToken) return null;
try {
const data = await apiClient.post<{ access_token: string }>('/auth/refresh', {
refresh_token: refreshToken,
});
if (typeof window !== 'undefined') {
localStorage.setItem('access_token', data.access_token);
}
return data.access_token;
} catch {
return null;
}
}