# boban736/rita-cat architecture

> Architecture diagram of the GitHub repository boban736/rita-cat, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/boban736/rita-cat
- Repository: https://github.com/boban736/rita-cat

## Overview

Ритка — PWA-трекер кормления кошки. Основной сценарий: пользователь записывает кормление, приложение хранит его и показывает дневной прогресс; отдельно учитываются закупки, остаток корма, вода и процедуры. По расписанию проверяется, достигнуты ли пороги кормления, и при необходимости отправляется push. Связи API с хранилищем и отправителем push подтверждены sampled source; связи UI с конкретными API оставлены без стрелок, поскольку исходники компонентов не были представлены.

Main entry points: [`lib/supabase.ts`](https://github.com/boban736/rita-cat/blob/main/lib/supabase.ts) (Клиент Supabase), [`app/api/feedings/route.ts`](https://github.com/boban736/rita-cat/blob/main/app/api/feedings/route.ts) (Кормления API), [`app/api/cron/check-feeding/route.ts`](https://github.com/boban736/rita-cat/blob/main/app/api/cron/check-feeding/route.ts) (Проверка кормления), [`app/api/auth/route.ts`](https://github.com/boban736/rita-cat/blob/main/app/api/auth/route.ts) (Вход API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["Вход и доступ"]
  node_auth_api["Вход API<br/>[route.ts]"]
  node_auth_lib["Проверка доступа<br/>[auth.ts]"]
end

subgraph group_feeding["Кормления"]
  node_feeding_api["Кормления API<br/>[route.ts]"]
  node_feeding_item_api["Изменение кормления<br/>[route.ts]"]
  node_bulk_api["Пакетная запись<br/>[route.ts]"]
end

subgraph group_care["Запасы и уход"]
  node_purchases_api["Закупки API<br/>[route.ts]"]
  node_stock_api["Расчёт запаса<br/>[route.ts]"]
  node_water_api["Смена воды API<br/>[route.ts]"]
  node_procedures_api["Процедуры API<br/>[route.ts]"]
  node_settings_api["Настройки API<br/>[route.ts]"]
  node_spending_api["Статистика расходов<br/>[route.ts]"]
  node_supabase_client["Клиент Supabase<br/>[supabase.ts]"]
end

subgraph group_notifications["Напоминания и PWA"]
  node_status_api["Сводка статуса<br/>[route.ts]"]
  node_feeding_cron["Проверка кормления<br/>[route.ts]"]
  node_stock_cron["Проверка запасов<br/>[route.ts]"]
  node_push_api["Подписка на push<br/>[route.ts]"]
  node_push_key_api["Ключ push<br/>[route.ts]"]
  node_webpush["Отправка push<br/>[webpush.ts]"]
  node_service_worker["PWA-обработчик<br/>[sw.js]"]
  node_manifest["PWA-манифест<br/>[manifest.ts]"]
end

subgraph group_interface["Интерфейс"]
  node_login["Экран входа<br/>[page.tsx]"]
  node_dashboard["Главная панель<br/>[page.tsx]"]
  node_feeding_ui["Запись кормления<br/>[FeedingForm.tsx]"]
  node_feeding_list["История кормлений<br/>[FeedingList.tsx]"]
  node_bulk_ui["Кормления наперёд"]
  node_progress_ui["Прогресс лимита<br/>[DryProgress.tsx]"]
  node_purchases_ui["Закупки<br/>[PurchaseModal.tsx]"]
  node_purchase_history["История закупок"]
  node_stock_ui["Остаток корма<br/>[StockWidget.tsx]"]
  node_water_ui["Напоминание о воде<br/>[WaterWidget.tsx]"]
  node_procedures_ui["Здоровье и процедуры<br/>[HealthTab.tsx]"]
end

node_owner(("Владелец кошки"))
node_database[("Supabase PostgreSQL")]
node_push_service["Push-служба браузера"]

node_owner -->|"входит"| node_login
node_login -->|"передаёт пароль"| node_auth_api
node_auth_api -->|"проверяет пароль"| node_auth_lib
node_owner -->|"открывает"| node_dashboard
node_feeding_api -->|"проверяет доступ"| node_auth_lib
node_feeding_api -->|"читает и пишет"| node_supabase_client
node_feeding_item_api -->|"изменяет записи"| node_supabase_client
node_purchases_api -->|"читает и пишет"| node_supabase_client
node_stock_api -->|"читает данные"| node_supabase_client
node_water_api -->|"обновляет дату"| node_supabase_client
node_procedures_api -->|"читает и пишет"| node_supabase_client
node_settings_api -->|"читает и пишет"| node_supabase_client
node_spending_api -->|"читает расходы"| node_supabase_client
node_status_api -->|"читает сводку"| node_supabase_client
node_feeding_cron -->|"считает кормления"| node_supabase_client
node_feeding_cron -->|"отправляет напоминание"| node_webpush
node_webpush -->|"доставляет push"| node_push_service
node_push_api -->|"сохраняет подписку"| node_supabase_client
node_push_key_api -->|"отдаёт ключ подписки"| node_owner
node_manifest -->|"описывает установку"| node_owner
node_service_worker -->|"обрабатывает push"| node_push_service
node_supabase_client -->|"запрашивает данные"| node_database

click node_login "https://github.com/boban736/rita-cat/blob/main/app/login/page.tsx"
click node_auth_api "https://github.com/boban736/rita-cat/blob/main/app/api/auth/route.ts"
click node_auth_lib "https://github.com/boban736/rita-cat/blob/main/lib/auth.ts"
click node_dashboard "https://github.com/boban736/rita-cat/blob/main/app/dashboard/page.tsx"
click node_feeding_ui "https://github.com/boban736/rita-cat/blob/main/components/FeedingForm.tsx"
click node_feeding_list "https://github.com/boban736/rita-cat/blob/main/components/FeedingList.tsx"
click node_bulk_ui "https://github.com/boban736/rita-cat/blob/main/components/BulkFeedingModal.tsx"
click node_progress_ui "https://github.com/boban736/rita-cat/blob/main/components/DryProgress.tsx"
click node_feeding_api "https://github.com/boban736/rita-cat/blob/main/app/api/feedings/route.ts"
click node_feeding_item_api "https://github.com/boban736/rita-cat/blob/main/app/api/feedings/%5Bid%5D/route.ts"
click node_bulk_api "https://github.com/boban736/rita-cat/blob/main/app/api/feedings/bulk/route.ts"
click node_purchases_ui "https://github.com/boban736/rita-cat/blob/main/components/PurchaseModal.tsx"
click node_purchase_history "https://github.com/boban736/rita-cat/blob/main/components/PurchaseHistory.tsx"
click node_stock_ui "https://github.com/boban736/rita-cat/blob/main/components/StockWidget.tsx"
click node_purchases_api "https://github.com/boban736/rita-cat/blob/main/app/api/purchases/route.ts"
click node_stock_api "https://github.com/boban736/rita-cat/blob/main/app/api/stock/route.ts"
click node_water_ui "https://github.com/boban736/rita-cat/blob/main/components/WaterWidget.tsx"
click node_water_api "https://github.com/boban736/rita-cat/blob/main/app/api/water/route.ts"
click node_procedures_ui "https://github.com/boban736/rita-cat/blob/main/components/HealthTab.tsx"
click node_procedures_api "https://github.com/boban736/rita-cat/blob/main/app/api/procedures/route.ts"
click node_settings_api "https://github.com/boban736/rita-cat/blob/main/app/api/settings/route.ts"
click node_spending_api "https://github.com/boban736/rita-cat/blob/main/app/api/stats/spending/route.ts"
click node_status_api "https://github.com/boban736/rita-cat/blob/main/app/api/status/route.ts"
click node_feeding_cron "https://github.com/boban736/rita-cat/blob/main/app/api/cron/check-feeding/route.ts"
click node_stock_cron "https://github.com/boban736/rita-cat/blob/main/app/api/cron/check-stock/route.ts"
click node_push_api "https://github.com/boban736/rita-cat/blob/main/app/api/push/subscribe/route.ts"
click node_push_key_api "https://github.com/boban736/rita-cat/blob/main/app/api/push/key/route.ts"
click node_webpush "https://github.com/boban736/rita-cat/blob/main/lib/webpush.ts"
click node_service_worker "https://github.com/boban736/rita-cat/blob/main/public/sw.js"
click node_manifest "https://github.com/boban736/rita-cat/blob/main/app/manifest.ts"
click node_supabase_client "https://github.com/boban736/rita-cat/blob/main/lib/supabase.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_auth_api,node_auth_lib toneBlue
class node_feeding_api,node_feeding_item_api,node_bulk_api,node_database toneAmber
class node_purchases_api,node_stock_api,node_water_api,node_procedures_api,node_settings_api,node_spending_api,node_supabase_client toneMint
class node_status_api,node_feeding_cron,node_stock_cron,node_push_api,node_push_key_api,node_webpush,node_service_worker,node_manifest toneRose
class node_login,node_dashboard,node_feeding_ui,node_feeding_list,node_bulk_ui,node_progress_ui,node_purchases_ui,node_purchase_history,node_stock_ui,node_water_ui,node_procedures_ui,node_owner,node_push_service toneIndigo
```

## Components

### Вход и доступ

- [Вход API](https://github.com/boban736/rita-cat/blob/main/app/api/auth/route.ts): `app/api/auth/route.ts`
- [Проверка доступа](https://github.com/boban736/rita-cat/blob/main/lib/auth.ts): `lib/auth.ts`

### Кормления

- [Кормления API](https://github.com/boban736/rita-cat/blob/main/app/api/feedings/route.ts): `app/api/feedings/route.ts`
- [Изменение кормления](https://github.com/boban736/rita-cat/blob/main/app/api/feedings/%5Bid%5D/route.ts): `app/api/feedings/[id]/route.ts`
- [Пакетная запись](https://github.com/boban736/rita-cat/blob/main/app/api/feedings/bulk/route.ts): `app/api/feedings/bulk/route.ts`

### Запасы и уход

- [Закупки API](https://github.com/boban736/rita-cat/blob/main/app/api/purchases/route.ts): `app/api/purchases/route.ts`
- [Расчёт запаса](https://github.com/boban736/rita-cat/blob/main/app/api/stock/route.ts): `app/api/stock/route.ts`
- [Смена воды API](https://github.com/boban736/rita-cat/blob/main/app/api/water/route.ts): `app/api/water/route.ts`
- [Процедуры API](https://github.com/boban736/rita-cat/blob/main/app/api/procedures/route.ts): `app/api/procedures/route.ts`
- [Настройки API](https://github.com/boban736/rita-cat/blob/main/app/api/settings/route.ts): `app/api/settings/route.ts`
- [Статистика расходов](https://github.com/boban736/rita-cat/blob/main/app/api/stats/spending/route.ts): `app/api/stats/spending/route.ts`
- [Клиент Supabase](https://github.com/boban736/rita-cat/blob/main/lib/supabase.ts): `lib/supabase.ts`

### Напоминания и PWA

- [Сводка статуса](https://github.com/boban736/rita-cat/blob/main/app/api/status/route.ts): `app/api/status/route.ts`
- [Проверка кормления](https://github.com/boban736/rita-cat/blob/main/app/api/cron/check-feeding/route.ts): `app/api/cron/check-feeding/route.ts`
- [Проверка запасов](https://github.com/boban736/rita-cat/blob/main/app/api/cron/check-stock/route.ts): `app/api/cron/check-stock/route.ts`
- [Подписка на push](https://github.com/boban736/rita-cat/blob/main/app/api/push/subscribe/route.ts): `app/api/push/subscribe/route.ts`
- [Ключ push](https://github.com/boban736/rita-cat/blob/main/app/api/push/key/route.ts): `app/api/push/key/route.ts`
- [Отправка push](https://github.com/boban736/rita-cat/blob/main/lib/webpush.ts): `lib/webpush.ts`
- [PWA-обработчик](https://github.com/boban736/rita-cat/blob/main/public/sw.js): `public/sw.js`
- [PWA-манифест](https://github.com/boban736/rita-cat/blob/main/app/manifest.ts): `app/manifest.ts`

### Интерфейс

- [Экран входа](https://github.com/boban736/rita-cat/blob/main/app/login/page.tsx): `app/login/page.tsx`
- [Главная панель](https://github.com/boban736/rita-cat/blob/main/app/dashboard/page.tsx): `app/dashboard/page.tsx`
- [Запись кормления](https://github.com/boban736/rita-cat/blob/main/components/FeedingForm.tsx): `components/FeedingForm.tsx`
- [История кормлений](https://github.com/boban736/rita-cat/blob/main/components/FeedingList.tsx): `components/FeedingList.tsx`
- [Кормления наперёд](https://github.com/boban736/rita-cat/blob/main/components/BulkFeedingModal.tsx): `components/BulkFeedingModal.tsx`
- [Прогресс лимита](https://github.com/boban736/rita-cat/blob/main/components/DryProgress.tsx): `components/DryProgress.tsx`
- [Закупки](https://github.com/boban736/rita-cat/blob/main/components/PurchaseModal.tsx): `components/PurchaseModal.tsx`
- [История закупок](https://github.com/boban736/rita-cat/blob/main/components/PurchaseHistory.tsx): `components/PurchaseHistory.tsx`
- [Остаток корма](https://github.com/boban736/rita-cat/blob/main/components/StockWidget.tsx): `components/StockWidget.tsx`
- [Напоминание о воде](https://github.com/boban736/rita-cat/blob/main/components/WaterWidget.tsx): `components/WaterWidget.tsx`
- [Здоровье и процедуры](https://github.com/boban736/rita-cat/blob/main/components/HealthTab.tsx): `components/HealthTab.tsx`

### Other components

- **Владелец кошки**
- **Supabase PostgreSQL**
- **Push-служба браузера**

## Connections

- Владелец кошки → Экран входа: входит
- Экран входа → Вход API: передаёт пароль
- Вход API → Проверка доступа: проверяет пароль
- Владелец кошки → Главная панель: открывает
- Кормления API → Проверка доступа: проверяет доступ
- Кормления API → Клиент Supabase: читает и пишет
- Изменение кормления → Клиент Supabase: изменяет записи
- Закупки API → Клиент Supabase: читает и пишет
- Расчёт запаса → Клиент Supabase: читает данные
- Смена воды API → Клиент Supabase: обновляет дату
- Процедуры API → Клиент Supabase: читает и пишет
- Настройки API → Клиент Supabase: читает и пишет
- Статистика расходов → Клиент Supabase: читает расходы
- Сводка статуса → Клиент Supabase: читает сводку
- Проверка кормления → Клиент Supabase: считает кормления
- Проверка кормления → Отправка push: отправляет напоминание
- Отправка push → Push-служба браузера: доставляет push
- Подписка на push → Клиент Supabase: сохраняет подписку
- Ключ push → Владелец кошки: отдаёт ключ подписки
- PWA-манифест → Владелец кошки: описывает установку
- PWA-обработчик → Push-служба браузера: обрабатывает push
- Клиент Supabase → Supabase PostgreSQL: запрашивает данные
