Обновление файла
This commit is contained in:
@@ -1,5 +1,74 @@
|
|||||||
|
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`),
|
getInstanceLive: (id) => request(`/instances/${id}/live`),
|
||||||
getInstanceIp: (id) => request(`/instances/${id}/ip`),
|
getInstanceIp: (id) => request(`/instances/${id}/ip`),
|
||||||
deleteInstance: (id) => request(`/instances/${id}`, { method: "DELETE" }),
|
deleteInstance: (id) => request(`/instances/${id}`, { method: "DELETE" }),
|
||||||
|
|
||||||
fetchProxmoxTemplates: () => request("/templates/from-proxmox"),
|
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" }),
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user