Files
makelore/src/lib/user-sync.ts
2026-07-29 17:22:35 +08:00

54 lines
1.8 KiB
TypeScript

import { hostApiFetch } from '@/lib/host-api';
import {
normalizeUserSyncBootstrap,
toUserSyncPartner,
toUserSyncPreferences,
type UserSyncBootstrap,
type UserSyncPartner,
type UserSyncPreferences,
} from '../../shared/user-sync';
type UserSyncBootstrapResponse = {
success: boolean;
error?: string;
bootstrap?: unknown;
};
function requireBootstrapResponse(response: UserSyncBootstrapResponse, fallback: string): UserSyncBootstrap {
if (!response.success || !response.bootstrap) {
throw new Error(response.error || fallback);
}
return normalizeUserSyncBootstrap(response.bootstrap);
}
export async function fetchUserSyncBootstrap(accessToken: string): Promise<UserSyncBootstrap> {
const response = await hostApiFetch<UserSyncBootstrapResponse>('/api/user-sync/bootstrap', {
headers: { 'x-niancode-access-token': accessToken },
});
return requireBootstrapResponse(response, 'Failed to fetch user sync bootstrap');
}
export async function pushUserSyncPreferences(
accessToken: string,
preferences: UserSyncPreferences,
): Promise<UserSyncBootstrap> {
const response = await hostApiFetch<UserSyncBootstrapResponse>('/api/user-sync/preferences', {
method: 'PUT',
headers: { 'x-niancode-access-token': accessToken },
body: JSON.stringify(toUserSyncPreferences(preferences)),
});
return requireBootstrapResponse(response, 'Failed to push user preferences');
}
export async function pushUserSyncPartner(
accessToken: string,
partner: UserSyncPartner,
): Promise<UserSyncBootstrap> {
const response = await hostApiFetch<UserSyncBootstrapResponse>('/api/user-sync/partners', {
method: 'POST',
headers: { 'x-niancode-access-token': accessToken },
body: JSON.stringify(toUserSyncPartner(partner)),
});
return requireBootstrapResponse(response, 'Failed to push user partner');
}