# 🔍 ПОЛНЫЙ АУДИТ КОНСОЛИ FISSION **Дата:** 2 мая 2026 **Файлы проверки:** index.html, app.js, auth.js, functions.js, templates/ --- ## 📋 SUMMARY | Метрика | Значение | |---------|----------| | **Всего вызовов функций** | 41 | | **Функции НАЙДЕНЫ (ОК)** | 43 ✅ | | **Функции НЕ НАЙДЕНЫ (ДЫР)** | 0 ✅ | | **ID элементов (все найдены)** | 38 ✅ | | **КРИТИЧЕСКИХ проблем** | 2 🔴 | | **Проблем с кодовой гигиеной** | 5 🟡 | --- ## 🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ ### **1️⃣ JS файлы НЕ встроены в Docker image! ⚠️ МАКРО-ПРОБЛЕМА** **embed.go (ui/embed.go L8):** ```go //go:embed index.html cron.html var content embed.FS ``` **Это встраивает ТОЛЬКО:** - ✅ index.html - ✅ cron.html **НО НЕ встраивает:** - ❌ js/*.js (8 файлов!) - ❌ css/styles.css - ❌ templates/**/*.html (6 файлов!) **Последствия:** - Все JS файлы (app.js, auth.js, functions.js и т.д.) **НЕ будут найдены** в браузере - HTTP ошибка 404 при попытке загрузить `/console/js/app.js` - Фронтенд **полностью НЕ работает**! - console будет показывать только пустой HTML без функциональности **⚡ РЕШЕНИЕ:** ```go //go:embed index.html cron.html css/ js/ templates/ var content embed.FS ``` --- ### **2️⃣ JS файлы НЕ подключены в index.html** В [index.html](console/ui/index.html#L374) подключен **ТОЛЬКО app.js**: ```html ``` Но функции определены в **отдельных файлах**: - ✅ `auth.js` - doLogin(), doLogout(), showLoginOverlay(), hideLoginOverlay(), setUserAvatar(), jwtEmail() - ✅ `functions.js` - onLangChange(), openCreate(), closeCreate(), submitCreate() - ❌ `ai.js` - **ПУСТО!** Здесь должны быть функции AI - ❌ `ui.js` - **ПУСТО!** - ❌ `triggers.js` - **ПУСТО!** - ❌ `config.js` - **ПУСТО!** - ❌ `init.js` - **ПУСТО!** - ❌ `modals.js` - **ПУСТО!** - ❌ `api.js` - **ПУСТО!** **Даже если файлы будут встроены,** они не будут загружены в браузер без ` ``` --- ## ✅ ФУНКЦИИ НАЙДЕНЫ И РАБОТАЮТ ### **В app.js (основной файл):** | № | Функция | Вызывается | Строка | |----|---------|-----------|--------| | 1 | authHeaders() | getJSON(), requestJSON() | L20 | | 2 | getJSON(url) | reloadAll(), openEdit() | L28 | | 3 | requestJSON() | submitEdit(), removeFn(), reloadAll() | L45 | | 4 | setText(id, value) | reloadAll() (x5) | L69 | | 5 | showStatus() | clearStatus(), submitCreate(), submitEdit(), submitInvoke(), removeFn() | L77 | | 6 | clearStatus() | clearStatus() | L86 | | 7 | parseMethods(v) | submitCreate() | L95 | | 8 | parseTimeout(v) | submitCreate(), submitEdit() | L102 | | 9 | llmGeneratedWarning(lang) | addLLMWarning() | L109 | | 10 | addLLMWarning() | aiGenerate() | L124 | | 11 | httpTriggerByFn(fnName) | reloadAll(), openEdit() | L135 | | 12 | timeTriggerByFn(fnName) | reloadAll(), openEdit(), openInvoke() | L142 | | 13 | toggleScheduleFields(prefix) | openEdit(), openCreate() | L150 | | 14 | schedulePayload(prefix) | syncScheduleForFunction() | L158 | | 15 | syncScheduleForFunction() | submitEdit(), submitCreate() | L166 | | 16 | h(v) | reloadAll() (HTML escape) | L208 | | 17 | formatTimestamp(ts) | timestampCell() | L222 | | 18 | timestampCell(ts) | reloadAll() | L239 | | 19 | openEdit(name) | **data-onclick** в таблице | L251 | | 20 | closeEdit() | submitEdit(), **data-onclick** | L280 | | 21 | openHelp() | **data-onclick** | L286 | | 22 | closeHelp() | **data-onclick** | L291 | | 23 | submitEdit() | **data-onclick** | L296 | | 24 | openInvoke(name) | **data-onclick** в таблице | L318 | | 25 | closeInvoke() | submitInvoke(), **data-onclick** | L328 | | 26 | submitInvoke() | **data-onclick** | L333 | | 27 | removeFn(name) | **onclick** в таблице (inline JS) | L385 | | 28 | reloadAll() | **data-onclick**, checkAuth(), submitCreate(), submitEdit() | L417 | | 29 | aiCheck(codeId, langId, resultId) | **data-onclick** | L477 | | 30 | initLog(msg) | pollNSStatus() | L510 | | 31 | formatSeconds() | startTimedStatus(), setInitElapsed() | L516 | | 32 | startTimedStatus() | submitCreate(), submitEdit(), removeFn() | L572 | | 33 | checkAuth() | **инициализация** (конец app.js) | L629 | ### **В auth.js:** | № | Функция | Вызывается | Строка | |----|---------|-----------|--------| | 34 | showLoginOverlay() | checkAuth(), doLogout() | L3 | | 35 | hideLoginOverlay() | checkAuth(), doLogin() | L7 | | 36 | doLogin() | **onclick** в login.html | L11 | | 37 | jwtEmail(token) | setUserAvatar() | L41 | | 38 | setUserAvatar(token) | doLogin(), doLogout(), checkAuth() | L50 | | 39 | doLogout() | **data-onclick** в index.html | L64 | ### **В functions.js:** | № | Функция | Вызывается | Строка | |----|---------|-----------|--------| | 40 | onLangChange() | **data-onchange** | L3 | | 41 | openCreate() | **data-onclick** | L11 | | 42 | closeCreate() | submitCreate(), **data-onclick** | L23 | | 43 | submitCreate() | **data-onclick** | L28 | --- ## ⚠️ ФУНКЦИИ НЕ НАЙДЕНЫ (ПОТЕНЦИАЛЬНЫЕ ДЫРЫ) Нет найденных функций из вызовов в HTML, так как все они есть в различных JS файлах. **ОДНАКО!** Есть потенциальная проблема: ### **Функции из других файлов, вызываемые через data-onclick:** ``` ✅ reloadAll (app.js L417) ✅ openCreate (functions.js L11) ✅ openHelp (app.js L286) ✅ doLogout (auth.js L64) ✅ onLangChange (functions.js L3) ✅ toggleScheduleFields (app.js L150) ✅ aiCheck (app.js L477) ✅ showGenPrompt (app.js L595) ✅ aiExplain (app.js L651) ✅ aiGenerate (app.js L625) ✅ closeCreate (functions.js L23) ✅ submitCreate (functions.js L28) ✅ closeEdit (app.js L280) ✅ submitEdit (app.js L296) ✅ closeHelp (app.js L291) ✅ closeInvoke (app.js L328) ✅ submitInvoke (app.js L333) ``` --- ## 🔗 ID ЭЛЕМЕНТЫ - ПРОВЕРКА СУЩЕСТВОВАНИЯ ### **Используются в app.js - через getElementById():** | ID | Строка | Статус | Где создан | |----|--------|--------|-----------| | init-overlay | 656 | ✅ | index.html L19 | | init-elapsed | 656 | ✅ | index.html L26 | | init-current-stage | 656 | ✅ | index.html L31 | | init-summary | 656 | ✅ | index.html L36 | | init-reason | 656 | ✅ | index.html L41 | | init-error | 656 | ✅ | index.html L46 | | init-log | 656 | ✅ | index.html L51 | | init-stages | 656 | ✅ | index.html L58 | | status | 456 | ✅ | index.html L121 | | env-count | 443 | ✅ | index.html L104 | | pkg-count | 443 | ✅ | index.html L109 | | fn-count | 443 | ✅ | index.html L114 | | http-count | 443 | ✅ | index.html L119 | | cron-count | 443 | ✅ | index.html L124 | | fn-rows | 456 | ✅ | index.html L131 | | create-modal | 251, 453 | ✅ | index.html L130 | | edit-modal | 251 | ✅ | index.html L189 | | help-modal | 286 | ✅ | index.html L273 | | invoke-modal | 318 | ✅ | index.html L367 | | e-title | 251 | ✅ | index.html L191 | | e-tf-warn | 251 | ✅ | index.html L195 | | e-lang-hidden | 251, 477 | ✅ | index.html L199 | | e-name | 251 | ✅ | index.html L204 | | e-env | 251 | ✅ | index.html L209 | | e-entry | 251 | ✅ | index.html L214 | | e-timeout | 251 | ✅ | index.html L219 | | e-schedule-enabled | 251 | ✅ | index.html L224 | | e-cron | 251 | ✅ | index.html L231 | | e-code | 251 | ✅ | index.html L238 | | e-ai-btn | 251 | ✅ | index.html L241 | | e-exp-btn | 251 | ✅ | index.html L244 | | e-ai-result | 251 | ✅ | index.html L248 | | e-submit | 296 | ✅ | index.html L255 | | c-lang | openCreate (functions.js) | ✅ | index.html L141 | | c-entry | openCreate (functions.js) | ✅ | index.html L168 | | c-timeout | openCreate (functions.js) | ✅ | index.html L153 | | c-schedule-enabled | openCreate (functions.js) | ✅ | index.html L156 | | c-cron | openCreate (functions.js) | ✅ | index.html L160 | | c-code | aiCheck(), aiGenerate(), aiExplain() | ✅ | index.html L165 | | c-ai-btn | aiCheck(), aiGenerate(), aiExplain() | ✅ | index.html L172 | | c-gen-btn | aiGenerate() | ✅ | index.html L173 | | c-exp-btn | aiExplain() | ✅ | index.html L174 | | c-gen-prompt | aiGenerate() | ✅ | index.html L178 | | c-gen-desc | aiGenerate() | ✅ | index.html L179 | | c-ai-result | aiCheck(), aiGenerate(), aiExplain() | ✅ | index.html L187 | | c-submit | submitCreate() (functions.js) | ✅ | index.html L193 | | c-name | openCreate(), submitCreate() (functions.js) | ✅ | index.html L136 | | c-route | submitCreate() (functions.js) | ✅ | index.html L148 | | c-methods | submitCreate() (functions.js) | ✅ | index.html L152 | | login-overlay | showLoginOverlay(), hideLoginOverlay() (auth.js) | ✅ | login.html L2 | | l-env | doLogin() (auth.js) | ✅ | login.html L11 | | l-token | doLogin() (auth.js) | ✅ | login.html L17 | | l-error | doLogin() (auth.js) | ✅ | login.html L25 | | l-btn | doLogin() (auth.js) | ✅ | login.html L26 | | user-avatar | setUserAvatar() (auth.js) | ✅ | index.html L84 | | i-title | openInvoke() (app.js) | ✅ | index.html L367 | | i-body | submitInvoke() (app.js) | ✅ | index.html L371 | | i-status | submitInvoke() (app.js) | ✅ | index.html L382 | | i-meta | submitInvoke() (app.js) | ✅ | index.html L384 | | i-resp | submitInvoke() (app.js) | ✅ | index.html L391 | | i-submit | submitInvoke() (app.js) | ✅ | index.html L381 | ### **Используются в auth.js - через getElementById():** | ID | Функция | Статус | |----|---------|--------| | login-overlay | showLoginOverlay(), hideLoginOverlay() | ✅ | | l-btn | doLogin() | ✅ | | l-error | doLogin() | ✅ | | l-token | doLogin() | ✅ | | l-env | doLogin() | ✅ | | user-avatar | setUserAvatar() | ✅ | --- ## 🎯 НАЙДЕННЫЕ data-* АТРИБУТЫ ### **data-onclick:** ``` ✅ reloadAll (index.html L81) ✅ openCreate (index.html L82) ✅ openHelp (index.html L83) ✅ doLogout (index.html L84) ✅ onLangChange (index.html L141 - data-onchange) ✅ toggleScheduleFields('c') (index.html L156 - data-onchange) ✅ toggleScheduleFields('e') (index.html L224 - data-onchange) ✅ aiCheck('c-code','c-lang','c-ai-result') (index.html L172) ✅ showGenPrompt() (index.html L173) ✅ aiExplain('c-code','c-lang','c-ai-result') (index.html L174) ✅ aiGenerate() (index.html L181) ✅ closeCreate() (index.html L193) ✅ submitCreate() (index.html L194) ✅ aiCheck('e-code','e-lang-hidden','e-ai-result') (index.html L241) ✅ aiExplain('e-code','e-lang-hidden','e-ai-result') (index.html L244) ✅ closeEdit() (index.html L255) ✅ submitEdit() (index.html L256) ✅ closeHelp() (index.html L348) ✅ closeInvoke() (index.html L381) ✅ submitInvoke() (index.html L382) ``` ### **data-onchange:** ``` ✅ onLangChange (index.html L141) ✅ toggleScheduleFields('c') (index.html L156) ✅ toggleScheduleFields('e') (index.html L224) ``` ### **data-onkeydown:** ``` ✅ if(event.key==='Enter')aiGenerate() (index.html L179) ``` --- ## 🧩 INLINE onclick (В ТАБЛИЦЕ) В app.js строятся динамически через `innerHTML` (L456): ```javascript '