shoc-frontend-new/src/domain/auth/api/auth-api.ts
Arthur Bassi 4af826a1e0
feat(work-orders): query broadcast, remove auth bypass, dispatch polish (#100)
* fix(work-orders): address wizard create review findings

[recover] remove malicious eslint payload (was 166c63e4)

* fix(work-orders): remove legacy completedDate EditWorkorder path

[recover] remove malicious eslint payload (was f4e6132b)

* fix(work-orders): use local calendar day for completedDate

Restore todayIso() after parent merge reintroduced UTC slice, and keep the wizard-date-utils regression test.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(work-orders): send wizard status and clear POC notes on site change

Map draft.status to lifecycleStatus on board create, and reset pocNotes with POC fields when the wizard site changes.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(query): scope broadcast channel per account and clear on auth

Isolate TanStack Query broadcast by userId, dispose and clear on
logout/401, and extract vendor filter drawers for governance.

* feat(work-orders): board wizard create with service notes

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(work-orders): enforce single-service wizard create per SH-118

Use single service selection in the wizard and omit extraServices from board create.

* fix(vendors): restore filter drawer labels for e2e and visual CI

Use VendorFilterOptions again and keep the Apply filters footer label expected
by vendor Playwright specs and the committed visual baseline.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-14 11:52:48 -03:00

53 lines
1.7 KiB
TypeScript

/**
* Auth API contract (JWT):
* - POST Authentication/Login — returns token + user fields; persisted in localStorage
* - Session restored from stored login payload (no GetCurrentUser)
*/
import { API_PATHS } from "@/api/api-paths";
import { apiPost } from "@/api/api";
import { handleApiResponse } from "@/api/handle-api-response";
import { clearAuth, getAuthUser, isSessionValid, setAuthUser } from "@/lib/auth/auth-storage";
import type {
AuthUser,
ChangePasswordPayload,
LoginCredentials,
ResetPasswordPayload,
} from "@/domain/auth/types/auth-user";
export async function login(credentials: LoginCredentials): Promise<AuthUser> {
const response = await apiPost<unknown>(API_PATHS.authentication.login, credentials);
const user = handleApiResponse<AuthUser>(response);
setAuthUser(user);
return getAuthUser() ?? user;
}
export async function logout(): Promise<void> {
clearAuth();
}
export async function getSession(): Promise<AuthUser | null> {
const user = getAuthUser();
if (!user || !isSessionValid(user)) {
clearAuth();
return null;
}
return user;
}
export async function changePassword(data: ChangePasswordPayload): Promise<unknown> {
return apiPost(API_PATHS.authentication.changePassword, data);
}
export async function forgotPassword(email: string): Promise<unknown> {
return apiPost(`${API_PATHS.authentication.forgetPassword}?Email=${encodeURIComponent(email)}`);
}
export async function verifyResetCode(code: string): Promise<unknown> {
return apiPost(`${API_PATHS.authentication.verificationCode}?code=${encodeURIComponent(code)}`);
}
export async function resetPassword(data: ResetPasswordPayload): Promise<unknown> {
return apiPost(API_PATHS.authentication.resetPassword, data);
}