ne radi vite server

This commit is contained in:
2026-05-23 21:52:15 +00:00
parent 80f9ba3879
commit 668195e642
32 changed files with 2096 additions and 680 deletions

View File

@@ -4,27 +4,38 @@
const RAW_BASE = import.meta.env.PUBLIC_API_URL;
const API_BASE = RAW_BASE.endsWith('/') ? RAW_BASE : `${RAW_BASE}/`;
/**
* POMOĆNA FUNKCIJA: Dohvaća token i postavlja Headere
* POMOĆNA FUNKCIJA: Dohvaća token i postavlja Headere.
* Podržava i klijentski localStorage i serverski (SSR) proslijeđeni token.
* @param {Object|FormData} bodyData - Podaci koji se šalju u body-ju zahtjeva
* @param {string|null} ssrToken - Izborni token proslijeđen sa serverske strane (Astro SSR)
*/
function getAuthHeaders(bodyData = {}) {
const token = typeof window !== 'undefined' ? localStorage.getItem('access_token') : null;
function getAuthHeaders(bodyData = {}, ssrToken = null) {
const headers = {};
// 🚀 PAMETAN DOHVAT TOKENA: Ako je proslijeđen ssrToken (server), koristi njega.
// Ako nije, a nalazimo se u pregledniku (klijent), povuci ga iz localStorage.
let token = ssrToken;
if (!token && typeof window !== 'undefined') {
token = localStorage.getItem('access_token');
}
if (token) {
headers['Authorization'] = `Bearer ${token}`; // Usklađeno sa Simple JWT standardom
}
// Provjera je li bodyData FormData (za slike/naloge)
// Provjera je li bodyData FormData (za slike/naloge s terena)
const isFormData = bodyData instanceof FormData;
// Ako NIJE FormData, šaljemo JSON
// Ako NIJE FormData, šaljemo standardni JSON content type
if (!isFormData) {
headers['Content-Type'] = 'application/json';
}
return headers;
}
/**
* Centralizirana obrada odgovora s Toast podrškom
*/
@@ -69,9 +80,13 @@ async function handleResponse(res) {
// --- RUTE ---
export const routes = {
// Autentifikacija (Maknute početne kose crte!)
// Autentifikacija
login: () => 'token/',
trenutniKorisnik: () => 'users/me/',
// Korisnici i operativni tehničari
serviseriSvi: () => 'users/',
serviserTerminal: (id) => `users/${id}/terminal/`,
// Radni nalozi
radniNalozi: (params = {}) => {
@@ -109,22 +124,72 @@ export const routes = {
// --- API METODE ---
/**
* Dohvat profila trenutno prijavljenog korisnika
* Dohvat profila korisnika iz opće liste /api/users/
* @param {string|null} ssrToken - Opcionalni token sa servera (Astro.cookies ili slično)
*/
export async function fetchCurrentUser() {
export async function fetchCurrentUser(ssrToken = null) {
if (typeof window === 'undefined' && !ssrToken) return null;
try {
const url = `${API_BASE}${routes.trenutniKorisnik()}`;
const res = await fetch(url, {
method: 'GET',
headers: getAuthHeaders()
headers: getAuthHeaders({}, ssrToken)
});
return await handleResponse(res);
const user = await handleResponse(res);
if (user && user.detail) return null;
return user;
} catch (e) {
console.error("fetchCurrentUser Failure:", e);
return null;
}
}
/**
* 🚀 NOVO (DRY): Dohvaća sve korisnike i vraća isključivo filtrirane servisere s terena
*/
export async function fetchServiseri() {
try {
const url = `${API_BASE}${routes.serviseriSvi()}`;
const res = await fetch(url, {
method: 'GET',
headers: getAuthHeaders()
});
const korisnici = await handleResponse(res);
if (!korisnici) return [];
const lista = Array.isArray(korisnici) ? korisnici : (korisnici.results || []);
// Filtriranje na temelju polja 'uloga' iz tvog CustomUser modela
return lista.filter(u => String(u.uloga).toUpperCase().trim() === 'SERVISER');
} catch (e) {
console.error("fetchServiseri Failure:", e);
return [];
}
}
/**
* 🚀 NOVO (DRY): Dohvaća ugniježđene terminal podatke za specifičnog servisera (Nalozi, Putni, Vozila)
* @param {number|string} id - ID servisera čiji se terminal učitava
*/
export async function fetchServiserTerminalData(id) {
try {
const url = `${API_BASE}${routes.serviserTerminal(id)}`;
const res = await fetch(url, {
method: 'GET',
headers: getAuthHeaders()
});
return await handleResponse(res);
} catch (e) {
console.error(`fetchServiserTerminalData za ID ${id} neuspješan:`, e);
return null;
}
}
/**
* Dohvat i filtriranje radnih naloga (za tablice i liste u operativi)
*/