Технічний аудит коду · для внутрішнього користування

English Prime LMS — де ми насправді

Зріз стану навчальної платформи за фактичним кодом двох репозиторіїв, а не за відчуттями. Мета — побачити межу робіт і піти на розмову з розробником з конкретними питаннями.

23 липня 2026 LionCode-org/lms-be · гілка dev LionCode-org/lms-fe · гілка develop
Головний висновок

Платформа не напівпорожня — вона майже готова. Ядро навчання працює і щодня допилюється на живих групах. Незакритий по суті один великий напрямок — прийом оплат. Реальна загроза для вересня — не код, а те, що команда розійшлася.

Функціонально готово ≈ 85%Лишилось ≈ 15%
2 410комітів з серпня 2024
8 / 10доменів завершені й у продакшні
1велика діра — оплати
177комітів не влиті в основну гілку
0автотестів на 7 300 нових рядків
Розділ 1

Що вже працює

Це не обіцянки з таблиці — це підтверджено кодом. Домени нижче мають повні моделі даних, API та інтерфейс, а частину з них видно за індексами під навантаження та моніторингом, тобто вони реально експлуатуються.

Готово

Онлайн-урок

Проведення уроку, слайди й презентація, конструктор речень, малювання по екрану, трансляція аудіо викладача студентам, чат уроку.

Готово

Відеозв'язок Jitsi

Вбудований дзвінок з JWT, демонстрація екрана з банером, кімнати для підгруп і кнопка «закрити всі», ім'я учасника з профілю.

Готово

Домашні завдання

Здача з автозбереженням чернетки, перевірка викладачем, поінпутне оцінювання, коментарі, чат студент↔викладач.

Готово

Іспити

П'ять частин, оцінка за комунікацію, автопідрахунок балів, блокування роботи після здачі, звіт.

Готово

Корекції

Найзріліша частина: ланцюжок «викладач править → студент відповідає → викладач підтверджує», інлайн-анотації, окремий день корекцій.

Готово

Групи й потоки

Потоки по рівнях, склад груп, розклад із канікулами, філії, історія викладачів, статуси навчання й оплати студента в групі.

Готово

Відвідуваність

Автоматична відмітка присутності й запізнення, облік входів-виходів із уроку, ручна корекція викладачем.

Готово

Бібліотека контенту

Слова з визначеннями по рівнях, малі слова з теорією для студента, моделі речень, ідіоми, відео. Списки переюзуються між уроками.

Готово

Розклад і календар

Календар подій, масовий зсув розкладу, окремий тип «день корекцій», перерахунок порядку уроків.

Готово

Користувачі й ролі

Студент, викладач, адмін, абітурієнт. Гранулярні права, меню під роль, заявки й активація акаунтів.

Готово

Заміна викладача

Повний цикл із подвійним погодженням: викладач → адмін, з відмовами, повторами та історією.

Готово

Чати й підтримка

Особисті та групові чати з вкладеннями, тікети підтримки з передачею між філіями. Усе в реальному часі.

Розділ 2

Що не закрито

Чотири напрямки з таблиці вашої команди. Аудит коду підтвердив діагноз і уточнив глибину: два з них суттєво ближчі до готовності, ніж здавалось, а один — насправді глибший.

Оплати

Писати з нуля

Це головна і єдина по-справжньому велика діра. У базі все змодельовано — тарифи, аванси, акції, сімейна знижка, статуси, навіть ключі LiqPay. Але коду прийому платежу немає ніде: підпис для платіжки не формується, callback-адреси не існує, жодного платіжного SDK у залежностях.

  • Тариф ніяк не пов'язаний з рахунком: сума не підтягується, мінімальний аванс не перевіряється, сімейна знижка — просто збережений прапорець без логіки нарахування.
  • Розділ «Транзакції» — це бухгалтерський журнал: оплату заводить адміністратор вручну постфактум. Кнопки «Сплатити» і «Завантажити PDF» намальовані, але ні на що не натискаються.
  • Сторінка оплати для абітурієнта — макет: ціни 6900 / 12420 / 16560 ₴ вписані просто в код, вибір нікуди не зберігається, кнопки лише гортають кроки.
  • Є покинута гілка з початком «пропозицій на оплату» — робота почалась у березні й зупинилась.

Це окремий спринт, а не доробка. Останній коміт по модулю — 21 січня 2026.

Налаштування

Переважно макети

Окремого модуля налаштувань на сервері не існує взагалі. В інтерфейсі є чотири вкладки, з них працює одна — вибір віджетів дашборда.

  • «Загальні» і «Повідомлення» — форми з перемикачами, які нічого не зберігають: обробник збереження порожній, кнопки «Зберегти» немає.
  • «Фінанси» — список ФОП із вигаданим IBAN у коді; додавання пише дані в консоль замість збереження.
  • При цьому пункт «Налаштування» показується в меню всім ролям.

Тут спершу потрібне рішення, а не робота: що саме має бути в налаштуваннях — і або доробити, або сховати вкладки до наступного етапу.

Сповіщення

Механізм є, подій майже нема

Приємна новина: сам механізм працює — сповіщення приходять миттєво, є дровер з вкладками й спливні повідомлення. Проблема не в трубі, а в тому, що в неї майже нічого не надходить.

  • Сповіщення шлються лише з двох місць: заміна викладача і нове повідомлення в чаті.
  • Немає жодного навчального сповіщення: «домашнє перевірено», «урок завтра», «є заборгованість», «створено тікет».
  • Пошта використовується тільки для реєстрації та відновлення пароля. Пуш-сповіщень немає.
  • Вкладка «Непрочитані» показує той самий список, що й «Усі»; лічильника непрочитаних на іконці немає.

Робота тут зрозуміла й обмежена: скласти перелік подій і підключити їх до готового механізму.

Опитування

Працює, бракує аналітики

Ще одна приємна новина: опитування зроблені, просто їх легко не помітити — вони не мають окремого пункту меню. Адмін створює їх у бібліотеках, студенту опитування спливає модалкою автоматично.

  • Працює запуск за тригерами: після певного уроку, до та після іспиту, негайно.
  • Немає зведення результатів. Дані збираються з розрізами по групі й рівню, але подивитись їх цілісно адмін не може — видно лише останню відповідь окремого студента.
  • Тригер «за датою» існує в інтерфейсі, але ніколи не спрацює — на сервері він не реалізований.
  • Оцінка уроку зірочками мертва: модель, таблиця й кнопка є, але сервер завжди повертає порожній список.
Розділ 3

Що зупинить запуск

Це не «допилювання», а речі, які треба закрити до того, як платформу можна назвати зданою. Вони дешеві в роботі, але дорогі, якщо їх пропустити.

Відеозв'язок працює через тестовий сервер

Адреса відеосервера вписана прямо в код і вказує на тимчасовий тестовий інстанс. У продакшні платформа буде залежати від сервера, який ніхто не обслуговує як бойовий. Це блокер: потрібен свій відеосервер і адреса в налаштуваннях, а не в коді.

Чужі сповіщення й корекції можна прочитати

Шість каналів реального часу пропускають будь-кого без перевірки. Технічно це означає, що залогінений користувач може підписатися на сповіщення й корекції іншої людини. Виправлення — кілька рядків, але зробити це треба до здачі.

Секрети лежать у репозиторії

Ключі відеосервера прописані як значення за замовчуванням у файлі конфігурації, а в прикладі налаштувань фронтенду — секрет Google. Усе це в історії Git. Ключі треба перевипустити, старі — вважати скомпрометованими.

Розгортання з нуля дасть непрацездатні права

Скрипт початкового заповнення створює ролі в іншому регістрі, ніж очікує код. Права отримає лише адміністратор, викладачі та студенти залишаться ні з чим. На чинному сервері це не видно — проявиться рівно тоді, коли платформу піднімуть на новому.

Дрібніше, але в тому ж списку

У бойовому API живе запит-налагоджувач, який обриває процес. Поруч — мертва інтеграція минулої відеоплатформи з чиєюсь особистою поштою і паролем у коді. Події календаря позначаються завершеними за 30 хвилин до реального кінця. На фронтенді немає перевірки маршрутів: студент, який вручну введе адресу адмінського розділу, побачить сторінку.

Розділ 4

Головний ризик — не код

Команда, яка будувала платформу, розійшлася

Це і є справжня відповідь на питання «чому немає кінця». Продукт не сирий — просто темп впав у кілька разів, бо його майже нікому тягнути.

ХтоЧастка кодуОстанній внесокСтан
Автор бекенду92%16.06.2026мовчить понад місяць
Автор фронтенду62%травень 20263 коміти за три місяці
Хто тягне заразодна людина23.07.2026за всю історію 7 комітів на бекенді
ПеріодКомітівЩо відбувалось
2024 · III–IV кв.534побудова ядра платформи
2025 · II кв.741пік: комунікації та інфраструктура
2025 · IV кв.478друга хвиля: організаційна модель школи
2026 · II кв.205точкове допилювання
2026 · липень16за 23 дні, силами однієї людини

Плюс борг релізу

Основні гілки обох репозиторіїв застаріли на два-три місяці. У робочих гілках висить 177 комітів, близько 7 300 доданих рядків і 9 незастосованих змін бази даних — уся сучасна перевірка домашніх завдань. Це окрема ризикована подія, яку не можна ставити на останній тиждень серпня. Автотестів немає, тож перевірятимуть руками.

Розділ 5

Порядок дій до вересня

Послідовність важлива: спершу знімаємо ризики, потім закриваємо функціонал. Найгірший сценарій — залишити злиття гілок і рішення про оплати на кінець серпня.

  1. Злити напрацьоване в основні гілки та прогнати зміни бази — на тестовому середовищі. Це найбільша технічна подія залишку. Робити зараз, поки є час на відкат, а не перед здачею.
  2. Ухвалити рішення про оплати. Розвилка з двох варіантів: або замовляємо інтеграцію платіжної системи як окремий спринт, або офіційно фіксуємо «оплати вносить адміністратор вручну» — і тоді прибираємо непрацюючі кнопки та сторінку оплати для абітурієнта.
  3. Закрити безпеку. Перевипустити ключі, закрити канали реального часу, полагодити скрипт ролей, прибрати налагоджувальний запит і мертву інтеграцію з паролем у коді.
  4. Перевести відеозв'язок на бойовий сервер і винести його адресу в налаштування.
  5. Визначити перелік подій для сповіщень і підключити їх до готового механізму — це найдешевша помітна цінність для школи.
  6. Вирішити долю налаштувань: доробити потрібні вкладки або сховати їх до наступного етапу.
  7. Додати зведення результатів опитувань і оживити оцінку уроку — обидва майже готові, бракує невеликої частини.
  8. Прибирання перед здачею: видалити мертвий модуль і залишки минулої відеоплатформи з залежностей, прибрати тестові дані та дописати 170 неперекладених рядків англійської версії.
Розділ 6

Питання на зустріч із розробником

Головне, що варто винести з цього документа: перелік, по якому можна пройтися пунктами і почути конкретні відповіді.

01Оплати входять у те, що ми здаємо у вересні?Якщо так — хто робить інтеграцію і за який строк. Якщо ні — фіксуємо письмово «оплати вручну» і прибираємо непрацюючі елементи.
02Чому 177 комітів досі не в основній гілці і коли плануєте злиття?Хто і як перевірятиме результат, якщо автотестів немає.
03Хто зараз реально в команді і хто добиватиме залишок?Два ключові автори не комітять з травня й червня. Це питання про строк більше, ніж будь-яке інше.
04Коли переходимо з тестового відеосервера на бойовий?Хто його адмініструє і чи витримає він реальну кількість одночасних уроків.
05Що саме має бути в «Налаштуваннях»?Три з чотирьох вкладок — макети. Треба або перелік того, що доробляємо, або рішення сховати.
06Які події мають надсилати сповіщення і чи потрібна пошта?Механізм готовий, бракує списку подій — це рішення школи, не розробника.
07Коли закриваємо відкриті канали й перевипускаємо ключі?Зараз сторонній може прочитати чужі сповіщення й корекції, а секрети лежать в історії репозиторію.
08Чи потрібна адміністраторам зведена аналітика опитувань?Дані збираються, але подивитись їх разом неможливо.
09Чи буде хоча б мінімальний набір тестів перед релізом?Зараз їх нуль, а зливається 7 300 рядків змін.
10Що конкретно вважається «здано» у вересні?Потрібен письмовий перелік, під яким підписуються обидві сторони. Без нього трекер поповнюватиметься нескінченно.