22 KiB
Подробный анализ истории и устройства проекта svc-api-x
Статус анализа
Этот отчет составлен повторно и отдельно от предыдущего файла, с опорой на проверенные факты из git-объектов, структуры каталогов и ключевых исходников.
Что удалось проверить напрямую:
- корневой коммит
- количество коммитов в текущей истории
- цепочку последних 8 коммитов
- наличие веток и отсутствие тегов
- стартовое дерево файлов корневого коммита
- текущую структуру каталогов
- ключевые технические файлы:
Application.cfc,resources/*,lib/rest_api_helper.cfc,build/Dockerfile,build/Jenkinsfile,v1/etc/readme.txt,v1/taffy/package.json
Что важно оговорить честно:
- обычные команды
git logиgit showв этом окружении часто подвисали - поэтому выводы ниже сделаны не по полному удобному логу, а по низкоуровневым объектам git и выборочным проверкам
- этого достаточно для надежной общей картины, но не для полной тематической классификации всех 364 коммитов
Ключевые факты
Базовые метаданные репозитория
- текущая история содержит 364 коммита
- корневой коммит:
ab5c944862b102e27a1f04da24ffe19c1e24093c - сообщение корневого коммита:
initial - дата корневого коммита:
2024-10-23 12:17:42 +0400 - автор корневого коммита:
msyu <msyu@mail.ru>
Текущие ветки:
- локальные:
dev,naeel - удаленные:
origin/dev,origin/naeel
Тегов нет.
Это сразу говорит о нескольких вещах:
- проект живет в обычной веточной модели без оформленных release tags
- история не выглядит как релизно-ориентированная
- контроль версий, вероятнее всего, велся через рабочую ветку
devи прикладные коммиты, а не через формальный релизный процесс
Когда и как появился репозиторий
Самый важный вывод по старту проекта: репозиторий возник не как минимальная заготовка, а как импорт уже существующей рабочей кодовой базы.
Основания для этого вывода:
- самый первый коммит уже называется просто
initial, без цепочки подготовительных bootstrap-коммитов - в корневом снимке сразу присутствуют прикладные файлы, инфраструктурные файлы и исторические артефакты
- в стартовом дереве уже есть:
.dockerignore.gitignorev1/Application.cfcv1/index.cfmv1/lib/*v1/resources/*v1/etc/bk/*v1/etc/info/*build/*
Особенно показательно наличие в самом первом коммите:
- backup-файлов
- каталога
bk - архивированных HTML-страниц и их ассетов в
v1/etc/info
Если бы проект создавался в git с нуля, такой набор в первом коммите почти не встречается. Это типичный след импорта уже существовавшей рабочей директории или внутреннего проекта, который до этого жил вне аккуратной git-структуры.
Что это за проект по назначению
Наиболее точное краткое описание: это CFML REST backend для deck, работающий на Lucee и Taffy поверх PostgreSQL.
Это не гипотеза, а прямой вывод из файла v1/etc/readme.txt, где сказано:
deck ReST backendLucee+Taffy+Postgre- API реализует ограниченное подмножество функций консоли
Также в том же файле перечислены функции API:
- список инстансов клиента с актуальными стейтами
- детализация инстанса
- конфигурирование инстанса через CFS-параметры
- создание инстанса
- запуск других операций сервиса
- детализация операции
- статус операции
- сервис с параметрами
То есть по предметной области это backend для сервисного каталога и управления экземплярами сервисов, а не просто справочный API.
Технологическая архитектура
Платформа выполнения
По build/Dockerfile проект собирается в контейнер на базе:
ortussolutions/commandbox:lucee5-alpine-3.9.2
Из этого следует:
- рантайм — Lucee
- запуск и конфигурация приложения идут через CommandBox
- проект рассчитан на контейнерное исполнение
В Dockerfile есть признаки production-like окружения:
- установка сертификатов
- настройка логирования Lucee/Runwar в stdout
- настройка heap size
- деплой JDBC-драйвера PostgreSQL
- проброс access/application logs в stdout
Это уже не локальный экспериментальный код, а сервис, который реально готовили к запуску в контейнерной среде.
CI/CD
build/Jenkinsfile очень короткий, но показательный:
- pipeline работает на
node("docker") - основной сценарий сборки подтягивается из отдельного репозитория
deck/universalDeckPipelines.git
Это значит:
- сам репозиторий не содержит весь CI logic внутри себя
- сборка и деплой централизованы через общую библиотеку пайплайнов
- проект встроен во внутреннюю инженерную инфраструктуру, а не живет изолированно
Приложение и framework
v1/Application.cfc расширяет taffy.core.api, то есть проект построен поверх Taffy REST framework.
Внутри Application.cfc видно:
- маппинги на
resources,lib,taffy - выбор конфигурации через
conf/prod.cfm,conf/stage.cfm,conf/dev.cfm - fallback-конфиг при отсутствии файлов окружения
- зависимость от IAM service
- использование переменных окружения Vault
- глобальные CORS-заголовки
- настройку версии API
Это говорит о том, что Application.cfc играет роль одновременно:
- точки входа
- конфигурационного слоя
- куска security/bootstrap logic
- адаптера к внешнему окружению
То есть архитектура эволюционная: часть системной логики сосредоточена в одном большом файле, а не строго разделена по слоям.
Taffy: внешний framework, включенный прямо в репозиторий
Важный архитектурный факт: Taffy лежит в репозитории как вендорнутый код в каталоге v1/taffy.
Это подтверждается несколькими фактами:
- каталог
v1/taffyсодержит типичную структуру самого framework:core,dashboard,tests,docs,examples,verify v1/taffy/ReadMe.md— это оригинальный README Taffyv1/taffy/package.jsonсодержит:- name:
cfml-taffy - version:
3.8.0 - repository:
https://github.com/atuttle/Taffy.git
- name:
Вывод:
- проект не просто использует Taffy как зависимость, а хранит его код у себя
- это упрощает разворачивание, но размывает границу между прикладным кодом и внешним framework
- для анализа истории это важно: часть дерева репозитория не является уникальным кодом команды, а представляет собой внешнюю библиотеку
Прикладная структура проекта
Верхний уровень
Верхнеуровневая структура показывает, что прикладная часть сосредоточена в v1:
v1/Application.cfcv1/index.cfmv1/libv1/resourcesv1/etcv1/taffy
Плюс рядом находятся:
build/Dockerfilebuild/JenkinsfileREADME.mdhealth.cfm
Каталог resources
Каталог v1/resources содержит REST-ресурсы уровня домена:
instance.cfcinstance_ls.cfcinstance_operation*.cfcsvc.cfcsvc_ls.cfcsvc_grouped_ls.cfcsvc_operation*.cfcresource_realm*.cfcuser.cfcnotification_ls.cfcbookmark*.cfcvault_record.cfc
Это показывает, что модель данных ориентирована на:
- сервисы и их операции
- экземпляры сервисов и их состояния
- параметры конфигурации
- ресурсные realm-ы
- пользователей и нотификации
То есть проект работает как API к сервисному каталогу и операционному состоянию объектов.
Каталог lib
В v1/lib лежит технический и вспомогательный код:
rest_api_helper.cfcJsonSerializer.cfcTokenGenerator.cfcjwt.cfcexpression_parser.cfcnotifier.cfcfield.cfm,field_set.cfmfilter_build.cfm,order_build.cfm
По содержимому rest_api_helper.cfc видно, что helper отвечает как минимум за:
- валидацию параметров
- сборку записей результата
- парсинг фильтрации
- парсинг сортировки
- нормализацию пустых значений
Это важный признак: сериализация и трансформация данных в API делаются не только на уровне framework, но и значительной частью вручную.
Что видно по коду ресурсов
svc.cfc
v1/resources/svc.cfc показывает типичный паттерн ресурса:
- ресурс наследуется от
taffy.core.resource - создается
lib.rest_api_helper - параметры валидируются вручную
- ответ собирается через SQL-запросы и helper layer
- данные агрегируются в вложенные структуры
Это не ORM-проект и не современный тонкий REST layer. Здесь API строится как ручная сборка JSON-представлений поверх SQL.
instance.cfc
v1/resources/instance.cfc еще показательнее:
- длинные SQL-запросы с join-ами
- извлечение состояния инстанса и операций прямо на уровне ресурса
- бизнес-логика частично находится рядом с SQL
- есть следы долгой эволюции: TODO, обсуждающие комментарии, оговорки про безопасность и поведение API
Архитектурный вывод:
- код ближе к стилю "толстый resource + SQL + helper", чем к чистому разделению controller/service/repository
- такая структура типична для развивавшегося внутреннего backend-сервиса, который долго меняли по рабочим требованиям
Что видно по внутренним заметкам разработчика
v1/etc/readme.txt особенно важен, потому что это не маркетинговый README, а рабочая инженерная заметка.
Из нее видно:
- проект напрямую связан с
deck - допускается обширное дублирование с приложением
deck - есть TODO по mappings, сертификатам, сериализации JSON, автотестам, изоляции клиентов, каталогу услуг
- некоторые строки содержат отметки дат осени 2024 года
Это показывает, что репозиторий в ранний период был рабочим internal-проектом с незавершенными архитектурными решениями, а не продуктом, доведенным до полностью выверенной структуры.
Последний наблюдаемый этап истории
Удалось надежно восстановить цепочку последних 8 коммитов:
-
dd3fd1391ff9a6f305266c320f8e8320f2209569- дата:
2026-04-20 15:40:44 +0400 - сообщение:
228 back again
- дата:
-
708f683188cf879f3040bb2188140e53dc320e6c- дата:
2026-04-20 21:09:08 +0400 - сообщение:
229 is_hidden fix
- дата:
-
eef7a95d574b1a9f7270b8ed1e86af68fdedeeca- дата:
2026-04-20 21:53:01 +0400 - сообщение:
229 is_disabled
- дата:
-
808ff75d6725f3e173420374c695cb39cdc2824c- дата:
2026-04-21 12:57:53 +0400 - сообщение:
231 append pseudorandom
- дата:
-
bc45b6cb9c21319059b09421bdbeeb72b78afae6- дата:
2026-04-24 10:32:58 +0400 - сообщение:
232 service catalog
- дата:
-
8a32a0d5f0dc6a112ea60ac4a1c26065b57bb3b4- дата:
2026-04-27 16:41:31 +0400 - сообщение:
233 service catalog preview
- дата:
-
74c073bd7e72926b842fa28a5d0fe78515531a91- дата:
2026-04-27 18:57:24 +0400 - сообщение:
234 attempt to fix js error Uncaught SyntaxError: Unexpected identifier 'hidden'
- дата:
-
f2718d4f44792c2b80b8b8f7e8e1b393c6621bac- дата:
2026-04-29 18:25:11 +0400 - сообщение:
deprecated secret clean
- дата:
Эта последовательность дает очень полезную картину.
Что она означает
Во-первых, в апреле 2026 проект активно меняли.
Во-вторых, по сообщениям видно, что активная работа шла не вокруг инфраструктуры, а вокруг прикладного UI/API-сценария сервисного каталога:
service catalogservice catalog previewis_hidden fixis_disabled- исправление JS syntax error
Это указывает, что сервис в тот момент использовался не только как чистый backend-API, но и как часть пользовательского сценария, где важны preview/hidden/disabled-состояния и совместимость с JS-фронтом.
В-третьих, финальный коммит deprecated secret clean стоит особняком. Он не продолжает продуктовую тему каталога, а выглядит как санитарная или безопасностная чистка.
Что можно сказать о зрелости процесса разработки
Плюсы
- проект явно реально использовался и менялся под живые требования
- есть контейнеризация
- есть Jenkins pipeline
- есть внешний IAM/Vault контекст
- структура домена уже достаточно богатая
- история не мертвая, а живая до конца апреля 2026
Минусы
- нет тегов, то есть релизная дисциплина слабая или вынесена вне репозитория
- в репозитории много исторического шума: backup-файлы, архивы, вспомогательные артефакты
- framework вендорнут внутрь проекта, что затрудняет отделение своего кода от внешнего
Application.cfcперегружен и совмещает несколько ролей- ресурсы местами слишком толстые и держат сложные SQL-запросы внутри себя
- комментарии в коде и
v1/etc/readme.txtпоказывают, что архитектура во многом развивалась по мере необходимости
Мой вывод о природе проекта
Это не учебный репозиторий, не демо и не аккуратный greenfield. Это рабочий внутренний backend для deck-контура, выросший эволюционно вокруг Lucee + Taffy + PostgreSQL.
Самая вероятная история его развития выглядит так:
Этап 1. До-git или ранний internal-код
Сначала существовал набор рабочего CFML-кода, возможно как часть более широкого deck-контекста или рядом с ним.
Этап 2. Импорт в отдельный репозиторий
23 октября 2024 года этот код был импортирован в git одним большим коммитом initial, уже вместе с историческим мусором, backup-файлами и сторонними артефактами.
Этап 3. Интеграция в инфраструктуру
Проект получил контейнерную упаковку, Jenkins pipeline, внешний конфиг по окружениям, IAM/Vault-зависимости.
Этап 4. Развитие прикладного API
Постепенно оформились ресурсы для сервисов, инстансов, операций, параметров и resource realm-ов.
Этап 5. Поздняя продуктовая доработка
В апреле 2026 шли изменения вокруг service catalog, preview, hidden/disabled-состояний и связанной JS-логики.
Этап 6. Санитарная зачистка
Последним наблюдаемым коммитом стала чистка deprecated secrets.
Что это означает practically
Если смотреть на репозиторий как на объект последующей очистки, упаковки или документирования, то нужно учитывать:
-
В репозитории смешаны три разных слоя:
- собственный прикладной код
- внешний framework Taffy
- исторические/вспомогательные артефакты
-
Нельзя анализировать проект только по README в корне. Корневой
README.mdпочти не несет полноценного описания. Более полезенv1/etc/readme.txtи сами ресурсы. -
Чистка проекта без потери смысла потребует сначала отделить:
- runtime-critical файлы
- вендорный код framework
- архивный мусор
- старые backup-файлы
-
Комментарии и TODO в коде здесь несут реальную историческую информацию. Если цель — сделать чистый исходный комплект, их можно сокращать. Если цель — сохранить инженерный контекст, удалять их без отдельного архива рискованно.
Итог
Самый точный краткий диагноз такой:
svc-api-x — это наследованный внутренний Lucee/CFML backend для deck, построенный поверх вендорнутого Taffy, импортированный в git сразу большим рабочим срезом и затем развивавшийся как сервисный API для каталога услуг, инстансов и операций, с поздними правками в UI/API-логике и последующей чисткой секретов.
Иначе говоря, это зрелая рабочая система с признаками долгой эволюции, а не чистый новый сервис.
Отчет сформирован GitHub Copilot GPT-5.4. Дата формирования: 2026-04-29 20:13:09 +0400.