Обновление файла

This commit is contained in:
2026-07-25 03:53:57 +03:00
parent 371460bcfb
commit 642a022ef6
+70 -1
View File
@@ -1,5 +1,74 @@
getInstanceLive: (id) => request(`/instances/${id}/live`),
const BASE = "/api";
function getToken() {
return localStorage.getItem("token");
}
async function request(path, { method = "GET", body, auth = true } = {}) {
const headers = {};
let payload = body;
if (body instanceof URLSearchParams) {
headers["Content-Type"] = "application/x-www-form-urlencoded";
} else if (body !== undefined) {
headers["Content-Type"] = "application/json";
payload = JSON.stringify(body);
}
if (auth) {
const token = getToken();
if (token) headers["Authorization"] = `Bearer ${token}`;
}
const res = await fetch(`${BASE}${path}`, { method, headers, body: payload });
if (!res.ok) {
let detail = res.statusText;
try {
const data = await res.json();
detail = data.detail || detail;
} catch {
/* тело не JSON */
}
throw new Error(typeof detail === "string" ? detail : JSON.stringify(detail));
}
if (res.status === 204) return null;
return res.json();
}
export const api = {
register: (email, password) =>
request("/auth/register", { method: "POST", body: { email, password }, auth: false }),
login: async (email, password) => {
const form = new URLSearchParams();
form.set("username", email);
form.set("password", password);
const data = await request("/auth/login", { method: "POST", body: form, auth: false });
localStorage.setItem("token", data.access_token);
return data;
},
logout: () => localStorage.removeItem("token"),
me: () => request("/auth/me"),
listTemplates: () => request("/templates"),
createTemplate: (payload) => request("/templates", { method: "POST", body: payload }),
listInstances: () => request("/instances"),
createInstance: (payload) => request("/instances", { method: "POST", body: payload }),
getInstance: (id) => request(`/instances/${id}`),
getInstanceStatus: (id) => request(`/instances/${id}/status`),
instanceAction: (id, action) =>
request(`/instances/${id}/action`, { method: "POST", body: { action } }),
getInstanceLive: (id) => request(`/instances/${id}/live`),
getInstanceIp: (id) => request(`/instances/${id}/ip`),
deleteInstance: (id) => request(`/instances/${id}`, { method: "DELETE" }),
fetchProxmoxTemplates: () => request("/templates/from-proxmox"),
deleteTemplate: (id) => request(`/templates/${id}`, { method: "DELETE" }),
listUsers: () => request("/admin/users"),
toggleUser: (id) => request(`/admin/users/${id}/toggle-active`, { method: "POST" }),
};