From de2707bf5a9cd8e42f169618becc5ca989652af5 Mon Sep 17 00:00:00 2001 From: gitgernit Date: Sun, 23 Nov 2025 15:16:37 +0300 Subject: [PATCH] docs(): add diagrams to rfc --- .images/abstract_domain.jpg | Bin 0 -> 45389 bytes RFC.md | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 .images/abstract_domain.jpg diff --git a/.images/abstract_domain.jpg b/.images/abstract_domain.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9f81149c639d298875a2094e7e24de1da3564a60 GIT binary patch literal 45389 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

%Tadnf0-y0Fjnj4Ce*Bi?P%L{ZXO+WV(J#i?QYH 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 _zEZo9eRnb4q^>B1M`%j%4Fh98$d=($ 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 literal 0 HcmV?d00001 diff --git a/RFC.md b/RFC.md index 06700a2..9411bfc 100644 --- a/RFC.md +++ b/RFC.md @@ -3,6 +3,8 @@ ## Архитектура. *(Всё как завещал дядюшка Боб...)* Проект следует чистой архитектуре дядюшки Боба. +![Чистая архитектура](.images/clean_arch.png) + # RFC-PROOD: Архитектура Recomenci Fluon @@ -59,6 +61,8 @@ RFC определяет интерфейсы для API, операционны - **Auth Identity**: методы аутентификации (email/password) - **Notification Device**: регистрация устройств для уведомлений +![Абстрактная диаграмма домена](.images/abstract_domain.jpg) + ### 5.2. Флоу создания резюме и предикта 1. Пользователь создает резюме через Gateway (AddResumeInteractor) 2. Gateway сохраняет резюме в хранилище и возвращает ответ @@ -80,6 +84,8 @@ RFC определяет интерфейсы для API, операционны - **Vacancy Embeddings**: векторные представления вакансий (384 измерения) - **Key Skills**: словарь навыков для автокомплита (GIN индекс с pg_trgm для ILIKE поиска) +![ER-диаграмма базы данных](.images/ER.png) + ## 7. Деплой и CI/CD - Локально: Docker Compose (just up/build) - Staging/Prod: Coolify