- 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>
51 lines
1.6 KiB
TypeScript
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;
|
|
}
|
|
}
|