diff --git a/README.md b/README.md index ead9b8a..f5f4e78 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # p1ctos4ve + Проект в рамках дисциплины «Конструирование программного обеспечения»: сервис сохранения и организации медиа со внешних ресурсов ## Участники @@ -44,29 +45,101 @@ #### Компоненты [[assets/c4-3components.jpg]] -#### Код -> WIP - ### Контракты API Краткая информация о методах API доступна в [assets/API.md](assets/API.md), а полная документация - в [Scalar](https://scalar.com/) на эндпоинте `/openapi`. ### Схема БД и оправдание с точки зрения нефункциональных требований -> WIP + +[[assets/db.png]] + +#### Нефункциональные требвания + +##### Оптимизация индексов и связей + +В схеме присутствуют индексы на полях, которые часто участвуют в поисковых запросах, например, `userId`, `visibility`, `shareUrl`, `tags`. Это повышает производительность выборок и операций поиска. + +Наличие внешних ключей с каскадным удалением гарантирует целостность данных и упрощает управление связанными данными между таблицами. + +##### Масштабируемость и расширяемость + +Пользователи, сессии и аккаунты разделены по разным таблицам - это упрощает работу и интеграцию способов авторизации пользователей в сервисе. + +##### Безопасность и уникальность данных + +Схема предотвращает дублирование данных посредством использования уникальных индексов. +Например, на email и token в сессиях, shareUrl в сейвах. ### Схема масштабирования сервиса при росте нагрузки в 10 раз + Для возможности масштабирования можно использовать следующие подходы: + - Размещение бекенда за балансировщиком нагрузки (например, Nginx, Traefik или Caddy): трафик будет распределяться равномерно между двумя или более экземплярами API - Репликация БД - основная база принимает запись, а одна или несколько реплик получают изменения по журналу (WAL) и обслуживают преимущественно чтение. - Кеширование частозапрашиваемых данных через Redis: результаты чтения (например, списки, карточки по ID, агрегации, результаты поиска с популярными фильтрами) складываются в KV хранилище с некоторым TTL, что позволяет сократить время ответа на повторяющиеся запросы ## Кодирование и отладка -> WIP + +Для разработки сервиса был использован следующий набор технологий: + +**Бекенд** + +- *Bun* в качестве рантайма +- Бекенд-фреймворк *Elysia* +- *Drizzle ORM* для работы с базой данных *PostgreSQL* +- Фреймворк *Better Auth* для авторизации и аутентификаци пользователей +- *SeaweedFS* для хранения UGC +- *Redis* для кеширования частозапрашиваемых данных + +**Фронтенд** + +- Фреймворк и библиотеки *Expo* для реализации мобильного клиента сервиса +- *Tailwind* + *Nativewind* для стилизации +- Набор иконок *Lucide* + +Для запуска в режиме разработки нужно: + +**Бекенд** + +- Установить зависимости: `bun i` +- В директории `apps/backend` заполнить файл `.env` на основе `.env.example` +- Прописать `bun dev` в директории бекенда или `bun backend:dev` в корне репозитория + +**Фронтенд** + +- В директории `apps/frontend` заполнить файл `.env` на основе `.env.example` +- Прописать `bun start` в директории фронтенда. Приложение можно отлаживать на мобильном устройстве через песочницу Expo Go. ## Unit-тестирование -> WIP + +В проекте есть тесты, проверяющие корректность работы отдельных элементов сервисов бекенда: +- `s3.service.test.ts` - проверяет корректность работы автоопределения типов медиа +- `saves.service.test.ts` - моковые тесты для проверки работы сервиса сейвов +- `scraper.service.test.ts` - тесты для проверки работы вычисления типов медиа на основе URL + +Для запуска требуется прописать `bun run test:unit` из директории `apps/backend`. ## Интеграционное тестирование -> WIP + +Также реализованы e2e-тесты для проверки авторизации и сейвов. + +Предварительно запустив бекенд, из директории бекенда нужно запустить `bun run test:e2e`. ## Сборка и запуск -> WIP + +Для запуска бекенда и его зависимостей на продакшене достаточно выполнить: + +``` +git clone https://git.inkling.su/p1ctos4ve/app p1ctos4ve +cd p1ctos4ve +chmod +x ./scripts/run.sh +./scripts/run.sh +``` + +Скрипт `run.sh`: +- Запустит PostgreSQL, SeaweedFS и Redis; +- Соберет образ бекенда в Docker-контейнер; +- Запустит unit и e2e-тесты; +- Поднимет сервер бекенда на `localhost:3000` + +В дальнейшем для взаимодействия с API можно открыть Scalar на `localhost:3000/openapi` в браузере. + diff --git a/apps/backend/package.json b/apps/backend/package.json index 3a0caaa..045159a 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -7,8 +7,8 @@ "start": "bun run dist/index.js", "test": "bun test", "test:watch": "bun test --watch", - "test:unit": "bun test ./src/tests/unit/**/*.test.ts", - "test:e2e": "bun test --preload ./src/tests/setup.ts ./src/tests/e2e/**/*.test.ts", + "test:unit": "bun test ./src/tests/unit/*.test.ts", + "test:e2e": "bun test --preload ./src/tests/setup.ts ./src/tests/e2e/*.test.ts", "db:generate": "drizzle-kit generate", "db:migrate": "bun run src/db/migrate.ts", "db:studio": "drizzle-kit studio" diff --git a/assets/db.png b/assets/db.png new file mode 100644 index 0000000..cc545f5 Binary files /dev/null and b/assets/db.png differ