Archived
1
0

chore: Добавлены разделы про код, тестирование и запуск в README

This commit is contained in:
2025-11-27 17:36:24 +03:00
parent 1220d08775
commit eaca07e399
3 changed files with 83 additions and 10 deletions

View File

@ -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` в браузере.

View File

@ -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"

BIN
assets/db.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB