import { api } from '../config/api'; import type { LoginResponse, GalleryAuthResponse } from '../types'; import { normalizeRequirePassword } from '../utils/accessControl'; const normalizeGalleryResponse = (response: GalleryAuthResponse): GalleryAuthResponse => ({ ...response, event: response.event ? { ...response.event, require_password: normalizeRequirePassword((response.event as any)?.require_password, true), } : response.event, }); export const authService = { // Admin authentication async adminLogin(credentials: { email: string; password: string; recaptchaToken?: string | null }): Promise { // Backend expects 'username' field, but we accept email const response = await api.post('/auth/admin/login', { username: credentials.email, password: credentials.password, recaptchaToken: credentials.recaptchaToken }); return response.data; }, async adminLogout() { try { await api.post('/auth/logout'); } catch (err) { // Ignore logout errors; fallback to redirect } finally { window.location.href = '/admin/login'; } }, // Gallery authentication async verifyGalleryPassword(slug: string, password?: string, recaptchaToken?: string | null): Promise { const response = await api.post('/auth/gallery/verify', { slug, password, recaptchaToken }); // Token is now handled by GalleryAuthContext with slug-specific storage return normalizeGalleryResponse(response.data); }, async shareLinkLogin(slug: string, token: string): Promise { const response = await api.post('/auth/gallery/share-login', { slug, token, }); return normalizeGalleryResponse(response.data); }, async galleryLogout(slug?: string | null) { try { await api.post('/auth/gallery/logout', { slug }); } catch (err) { // Ignore; cookie will naturally expire if removal fails } }, };