Это учебный проект, основной целью которого является изучение Kotlin на практике через разработку серверного приложения с применением ООП, SOLID и принципов чистой архитектуры.
- Kotlin
- Ktor
- Gradle Kotlin DSL
- kotlinx.serialization
- PostgreSQL
- Docker
Основная идея проекта — строгое отделение бизнес-логики от HTTP, базы данных и других внешних компонентов.
Код разделён на несколько независимых слоёв. Структура директории src/main/kotlin/:
├── application/ # Сценарии использования приложения (Use Cases)
├── data/ # Реализации источников данных (Репозитории, БД)
├── domain/ # Бизнес-модели, Value Objects и интерфейсы
├── presentation/ # HTTP DTO и представление данных (Контроллеры)
├── Main.kt # Точка входа и composition root
├── Routing.kt # Настройка эндпоинтов
├── StatusPages.kt # Настройка кастомных Exceptions
└── Serialization.kt # Настройка сериализации
13.08.26
- Заменил хранение исходного пароля в User на passwordHash.
- Добавил PasswordHasher и BCryptPasswordHasher для отделения бизнес-логики от конкретной реализации хеширования.
- Добавил Dockerfile для сборки и запуска Ktor backend в отдельном контейнере.
- Добавил Docker Compose для совместного запуска backend и PostgreSQL.
- Настроил передачу конфигурации через .env.
- Создал DatabaseConfig, который отвечает за чтение и представление настроек подключения к БД.
- Создал DatabaseFactory, отвечающий за создание подключения к PostgreSQL через Exposed/JDBC.
- В результате удалось сохранить Main.kt как composition root: он только создаёт зависимости, связывает их и запускает приложение.
14.08.26 Сегодня был очень продуктивный день.
- Исправил ошибки сборки и запуска backend в Docker.
- Добавил описание таблицы пользователей
UsersTableчерез Exposed. - Реализовал
PostgresUserRepositoryдля сохранения и получения пользователей из PostgreSQL. - Добавил
UserMapperдля преобразования данных Exposed (ResultRow) в domain-модельUser. - Добавил уникальные
emailиusername, а также отдельный неуникальныйnickname. - Перешёл на
kotlin.uuid.Uuidдля идентификаторов пользователей. - Добавил тесты для
EmailиUsername. - Начал integration-тестирование слоя базы данных с настоящим PostgreSQL через Testcontainers.