From 7e6d50920524a52b6be7fbc562d649cc779f56f8 Mon Sep 17 00:00:00 2001 From: "s.zotov" Date: Sun, 12 Apr 2026 20:46:34 +0000 Subject: [PATCH] Add "Architecture" --- Architecture.md | 238 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 Architecture.md diff --git a/Architecture.md b/Architecture.md new file mode 100644 index 0000000..fbeaca7 --- /dev/null +++ b/Architecture.md @@ -0,0 +1,238 @@ +# Архитектура проекта + +## Структура директорий + +``` +VA.ASPEKTER/ +├── z51-pug-builder/ # Основное приложение (название историческое) +│ ├── vite.config.js # ⭐ ВЕСЬ backend API (~1600 строк, Vite middleware) +│ ├── src/ +│ │ ├── App.svelte # ⭐ ВЕСЬ frontend UI (~6500 строк, монолит) +│ │ ├── app.css # Стили + темы (light/dark) +│ │ ├── main.js # Entry point Svelte +│ │ └── lib/ +│ │ ├── api.js # HTTP-клиент ко всем API эндпоинтам +│ │ ├── parsing.js # Парсинг Pug: блоки, миксины, секции, поля +│ │ ├── spellcheck.js # Извлечение текста из HTML, инъекция меток ошибок +│ │ └── utils.js # Утилиты +│ ├── public/ +│ │ ├── Block.pug # Исходные шаблоны всех блоков +│ │ ├── favicon.jpg +│ │ └── login-bg/ # Фоны страницы логина (5 изображений) +│ ├── data/ # ⚠️ НЕ в git — пользовательские данные +│ │ ├── _system/ # users.json, sessions.json +│ │ ├── config.json # Yonote token, URLs +│ │ ├── feed-cache.json # Кэш YML-фида на диске +│ │ ├── render-cache.json # Кэш рендера PUG→HTML +│ │ ├── uploads/ # Загруженные картинки +│ │ └── vipavenue/ # Данные проекта VipAvenue +│ │ ├── settings.json # Все настройки (FTP, фид, gender paths, блоки) +│ │ ├── presets.json # Пресеты блоков +│ │ ├── notes.json # Индекс заметок +│ │ ├── stats.json # Статистика времени сборки +│ │ ├── block.pug # Кастомный шаблон блоков +│ │ ├── drafts/{userId}.json # Черновики по юзерам +│ │ └── letters/{userId}/ # Письма по юзерам +│ │ ├── _index.json # Индекс писем +│ │ ├── {id}.json # Данные письма (блоки, тема, дата) +│ │ └── {id}.history.json # История изменений (макс 20 снэпшотов) +│ ├── Dockerfile +│ └── package.json +│ +├── email-gen/ # Pug-шаблоны писем (репозиторий коллег) +│ └── emails/ +│ ├── includes/ +│ │ └── mixins.pug # Общие миксины (preheader, spacerLine, buttons и т.д.) +│ ├── layout/ +│ │ └── layout.pug # Базовый layout письма +│ └── vipavenue/ +│ ├── parts/ +│ │ ├── header/ # header-woman.pug, header-man.pug +│ │ └── footer/ # footer-woman.pug, footer-man.pug +│ └── letters/ +│ └── let.pug # ⚠️ Генерируется автоматически при рендере +│ +├── deploy/ +│ ├── email-gen-api/ +│ │ ├── server.js # Микросервис рендера (~200 строк) +│ │ ├── Dockerfile +│ │ └── entrypoint.sh +│ ├── nginx/ # Референсный конфиг nginx +│ └── scripts/ +│ └── update-email-gen.sh # Скрипт обновления email-gen +│ +├── docker-compose.yml # DEV окружение (с HMR) +└── docker-compose.prod.yml # PROD окружение (образы) +``` + +## Цепочка рендера (подробно) + +``` +1. Пользователь собирает блоки в конструкторе + └── assembledBlocks[] → rebuildOutput() → outputPug (строка с PUG-кодом) + +2. Нажимает 🔄 или Ctrl+G + └── renderEmailPreview() → POST /api/project/vipavenue/render-email + Body: { projectSlug: 'vipavenue', pug: outputPug, preheader: '...', gender: 'female' } + +3. Backend (vite.config.js): + a. Экранирует #{} и !{} в pug (защита от инъекций) + b. Экранирует переносы строк в preheader + c. Проверяет render cache (MD5 от slug+pug+gender+genderPaths) + d. Если cache miss: + - Записывает pug в email-gen/emails/vipavenue/letters/let.pug + - Генерирует html.pug с gender-specific header/footer + - Отправляет POST к email-gen-api:8787/render + - Получает скомпилированный HTML + e. Параллельно загружает YML-фид (если настроен feedUrl) + f. Обрабатывает Mindbox-теги (подставляет данные из фида) + g. Применяет nowrap (висячие предлоги) + h. Возвращает: { html, previewHtml, unavailableProducts, feedSyncedAt } + +4. email-gen-api (server.js): + a. npm install если нет node_modules + b. Записывает let.pug + c. Генерирует html.pug с путями header/footer по гендеру + d. Компилирует через email-templates (Pug → HTML с инлайном CSS) + e. Заменяет #MAILRU_PREHEADER_TAG# → + f. Возвращает HTML + +5. Frontend получает HTML: + a. Показывает в