@startuml
!theme materia
skinparam componentStyle uml1
skinparam backgroundColor MOTIVATION
skinparam linetype ortho
skinparam actorStyle awesome
skinparam defaultTextAlignment center
skinparam classarrowcolor Black
skinparam SequenceMessageAlign reverseDirection

title [ARCH]: Recommendation system

rectangle APIGateway
actor Клиент as Client
component FastAPI
database DB <<Хранение рекомендаций на неделю>>
database Cache <<Кэш запросов>>
node SearchApi
database ClickHouse <<Хранение событий пользователей>>
node RSEngine <<Рекомендательная система>> {
    rectangle EventGetter1 <<Выгружает события>>
    rectangle Preparer <<Подготавливает данные \n для модели>>
    rectangle Loader <<Загружает наборы \n рекомендованных фильмов в DB>>
    rectangle CollaborativeFiltering <<Делает \n рекомендовации фильмов>>
}
node FilterByPopularity <<Популярные фильмы за неделю для "холодных" пользователей>> {
    rectangle EventGetter2 <<Выгружает события>>
    rectangle PopularFilms <<Подбирает популярные фильмы \n за неделю для "холодных" пользователей>>
}

Client --> APIGateway: Запрос списка \n рекомендованных фильмов
APIGateway ---> FastAPI: Проксирование запроса
FastAPI <-up--> DB: Запрос рекомендаций
ClickHouse --> EventGetter1
ClickHouse -right-> EventGetter2
EventGetter1 -left-> Preparer
Preparer -down-> CollaborativeFiltering
Preparer -left-> SearchApi
Preparer <--> Cache
CollaborativeFiltering -right-> Loader
EventGetter2 -down-> PopularFilms
PopularFilms --> DB: Сохранение подборки
DB <-- Loader: Сохранение рекомендаций
FastAPI -up-> SearchApi: Обогащение \n данных
FastAPI <-up--> Cache: Кэширование данных
@enduml
