/
sweetebin
/
hackaton_26
Обзор
Документация
Войти
/
sweetebin
/
hackaton_26
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
web-form-project/src/api/client.js
101 строка
3 KB
sweetebin
Трассировка до первоисточника в UI + CLI-инструментарий решений для агента
28 июл 2026, 17:22
28 июл 2026, 17:22
b4de763
Код
Авторство
О чём код?
const BASE = '/api'; async function handleResponse(res) { let body = null; try { body = await res.json(); } catch { // тело может отсутствовать } if (!res.ok) { throw new Error(body?.error || `Ошибка сервера: ${res.status}`); } return body; } // payload: { file } или { text }, extra — дополнительные поля формы/JSON function postData(url, { file, text }, extra = {}) { if (file) { const form = new FormData(); Object.entries(extra).forEach(([k, v]) => v != null && form.append(k, v)); form.append('file', file); return fetch(url, { method: 'POST', body: form }).then(handleResponse); } return fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...extra, text }), }).then(handleResponse); } export function listProjects() { return fetch(`${BASE}/projects`).then(handleResponse); } export function getProject(projectId) { return fetch(`${BASE}/projects/${projectId}`).then(handleResponse); } export function createProject({ name, jiraProjectKey, file, text }) { return postData(`${BASE}/projects`, { file, text }, { name, jiraProjectKey }); } export function addProjectData(projectId, { file, text }) { return postData(`${BASE}/projects/${projectId}/data`, { file, text }); } // Пачка файлов на экране сборки пула; ranges = { ticketsRange, backlogRange } для csv export function uploadSourceFiles(projectId, files, ranges = {}) { const form = new FormData(); if (ranges.ticketsRange) form.append('ticketsRange', ranges.ticketsRange); if (ranges.backlogRange) form.append('backlogRange', ranges.backlogRange); files.forEach((f) => form.append('files', f)); return fetch(`${BASE}/projects/${projectId}/sources/files`, { method: 'POST', body: form, }).then(handleResponse); } // Первичный документ целиком + извлечённые из него сигналы (трассировка) export function getSource(projectId, sourceId) { return fetch(`${BASE}/projects/${projectId}/sources/${sourceId}`).then(handleResponse); } export function deleteSource(projectId, sourceId) { return fetch(`${BASE}/projects/${projectId}/sources/${sourceId}`, { method: 'DELETE' }).then( handleResponse ); } export function sbertrackStatus() { return fetch(`${BASE}/sbertrack/status`).then(handleResponse); } // body: { tql, kind: 'ticket' | 'backlog', limit } export function sbertrackPull(projectId, body) { return fetch(`${BASE}/projects/${projectId}/sbertrack`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }).then(handleResponse); } export function startAnalysis(projectId) { return fetch(`${BASE}/projects/${projectId}/analyze`, { method: 'POST' }).then(handleResponse); } export function getJournal(projectId) { return fetch(`${BASE}/projects/${projectId}/journal`).then(handleResponse); } export function approveTask(projectId, taskId) { return fetch(`${BASE}/projects/${projectId}/tasks/${taskId}/approve`, { method: 'POST' }).then( handleResponse ); } export function rejectTask(projectId, taskId) { return fetch(`${BASE}/projects/${projectId}/tasks/${taskId}/reject`, { method: 'POST' }).then( handleResponse ); }