Проєкт LifeOS побудований на принципах Domain-Driven Design (DDD) та Hexagonal Architecture (Ports and Adapters). Це забезпечує гнучкість, тестованість та незалежність бізнес-логіки від зовнішніх факторів (бази даних, Telegram API тощо).
Розташування: internal/domain/
Це найважливіший шар, який містить бізнес-правила та сутності. Він не має жодних зовнішніх залежностей.
- Сутності (Entities): Мають унікальний ID та стан, що змінюється (напр.,
Note,Task,Habit). Поля зазвичай приватні, доступ тільки через методи. - Об'єкти-значення (Value Objects): Immutable об'єкти без ID, визначаються своїми атрибутами (напр.,
Priority,Status). - Інтерфейси репозиторіїв: Визначають, як домен взаємодіє з базою даних (без реалізації).
Розташування: internal/application/
Цей шар координує виконання задач. Він використовує доменні об'єкти для реалізації бізнес-логіки.
- Commands: Дії, що змінюють стан (Create, Update, Delete).
- Queries: Дії, що тільки повертають дані (List, Search).
- DTOs: Об'єкти для передачі даних між шарами.
Розташування: internal/infrastructure/
Містить технічні деталі та реалізацію інтерфейсів репозиторіїв.
- Persistence: Реалізація репозиторіїв для SQLite.
- External: Клієнти для зовнішніх API (напр., Weather).
- Scheduler: Планувальник для нагадувань.
Розташування: internal/interfaces/
Точка входу для користувача. В нашому випадку — це Telegram бот.
- Handlers: Приймають повідомлення від Telegram, викликають Application layer та повертають відповідь.
- Middleware: Авторизація, логування, обробка помилок.
internal/
├── domain/ # Бізнес-логіка (Entities, VOs, Interfaces)
│ ├── user/
│ ├── note/
│ ├── task/
│ ├── habit/
│ └── finance/
├── application/ # Use Cases (Commands, Queries)
├── infrastructure/ # Зовнішні деталі (DB, API, Scheduler)
└── interfaces/ # Telegram Adapters
- Незалежність від фреймворків: Бізнес-логіка не повинна залежати від бібліотеки Telegram.
- Тестованість: Завдяки портам та адаптерам, будь-яку частину можна протестувати за допомогою моків.
- Чіткі межі (Bounded Contexts): Нотатки, Задачі та Фінанси розділені на рівні логіки.