Files
UpAndDown/README.md
T

242 lines
13 KiB
Markdown

# TODO:
- Сделать реальные исполнители(executors) для регистрации, авторизации, логаута
- Посмотреть по поводу блокировок или тред пулла при использовании базы
- Посмотреть пулл соединений(Object pool) при использовании базы данных(посмотреть api MySQL-Connector)
- Посмотреть, что дает MySQL, какие там есть возможность
- Посмотреть и подумать, что лучше - корутины или многопоточность?
- Покрыть тестами класс User и AuthRegistrationExecutor
- Добавить clang-format(через CLion)
- Перевести GetByUUID GetByLogin на const ref/string_view в IUserDAO - также не vector, а span(погуглить)
- Привести к единоу виду функции IUserDAO
- Пройтись по коду и максимально наставить const
- Указать возможные исключения в интерфейсах DAO
- Вынести User в структуру. Hashed Password структура должна изначально состоять в другой структуре
- SharedPtr - передавать по константной ссылке.
- Сделать интеграционный тест по ручкам
# UseCase'ы приложения:
# Up And Down - система для учета и отслеживания состояния для людей, больных БАР
## UseCase №1
### 1.Название: Зарегистрировать пользователя
### 2.Актор: Пользователь
### 3.Цель: Внести данные о новом пользователе в систему
### 4.Предусловия:
* Пользователь не авторизован в системе
* Пользователь с данным login'ом отсутствует в системе
### 5.Основной поток:
#### А1.Пользователь при входе в систему выбрасывается из системы
* Пользователь заходит в приложение на любую страницу
* Из-за отсутсвия авторизации приложение перенаправляет его на страницу авторизации и регистрации
* Пользователь кликает по ссылке, ведущей на странице регистрации
* На странице регистрации пользователь вводит логин и пароль
* Пользователь нажимает кнопку "Зарегистрироваться"
* Система выводит сообщение, что пользователь зарегистрирован в приложении
### 6.Потоки исключений:
#### B1.Пользователь с таким логином уже есть в системе
* Процедура регистрации проваливается
* Выводится нотификация с сообщением об ошибке по причине наличия такого же логина в системе
#### B2.Пользователь оставил пустым логин или пустой/неправильный пароль
* При попытке регистрации подсвечиваются незаполненные поля, или поле пароля, если пароль неправильный
* Выводится сообщение об ошибке
### 7.Постусловия
* Пользователь с указанным логином сохранен в БД
### 8.API-Маршруты
* `POST /api/v1/Auth/Register` - Регистрация пользователя
### 9.Контракт
#### Register-Request
```
{
"login": "ivan_89",
"password": "S3cureP@ssw0rd"
}
```
##### Требования к валидации:
* login: 3-50 символов, ^[A-Za-z0-9_]+$, уникальное значение
* password: ≥ 5 символов
##### Response - 201 - Created
```
{
"user": {
"uuid": "51351bb1-7563-479d-a8e9-201d0ff934c2"
"login": "ivan_89"
}
}
```
##### Errors
* `409 USER_EXISTS` — пользователь с таким логином уже есть(`B1`)
* `422 VALIDATION_FAILED` — пустой логин/неправильный пароль(`B2`)
* `400 BAD_REQUEST` — сервер не смог десереализовать JSON
### 10. Используемые сущности ДБ
* users(uuid(PK), login(unique), hashed_password)
## UseCase №2
### 1.Название: Авторизация пользователя
### 2.Актор: Пользователь
### 3.Цель: Предоставить пользователю возможность получить его данные в виде дневника болезни
### 4.Предусловия:
* Пользователь должен быть зарегистрирован в системе
* Пользователь должен быть не авторизован в системе
### 5.Основной поток:
#### А1.Пользователь при входе в систему выбрасывается из системы
* Пользователь заходит в приложение на любую страницу
* Из-за отсутствия авторизации приложение перенаправляет его на страницу авторизации
* Пользователь вводит свой логин и пароль
* Пользователь получает токен, который открывает ему доступ к получению собственных данных
### 6.Альтернативные потоки:
#### B1.Введен неправильный логин или неправильный пароль
* Пользователь не получает токен, авторизация провалена
* Выводится сообщение об ошибке
#### B2.Поле логин или пароль оставлены пустыми
* При попытке авторизации не происходит запрос токена. Авторизация провалена
* Пустые поля подкрашиваются, как ошибочно заполненные
* Выводится сообщение об ошибке
### 7.Постусловия
* Сессия пользователя в виде токена сохраняется на сервере
* Пользователь перенаправлен на основную страницу, где выводится его дневник болезни
### 8.API-Маршруты
* `POST /api/v1/Auth/Login` - Вход пользователя в систему и получение токена
* `POST /api/v1/Auth/Logout` - Отозвать токен и выйти из системы.
### 9.Контракт
#### Login-Request
```
{
"login": "ivan_89",
"password": "S3cureP@ssw0rd"
}
```
##### Response - 200 - OK
```
{
"token": af32df3bas739f272bd109c823
"expiresIn": 36000000 // 10 часов
}
```
##### Errors
* `401 BAD_CREDENTIALS` — неверный логин/пароль (B1)
* `422 VALIDATION_FAILED` — пустые поля (B2)
#### Logout-Request
```
{
"token": af32df3bas739f272bd109c823
}
```
##### Response - 200 - OK
```
null
```
### 10. Используемые сущности ДБ
* users(uuid(PK), login(unique), hashed_password)
## UseCase №3
### 1.Название: Переход на главную страницу
### 2.Актор: Пользователь
### 3.Цель: Предоставить пользователю поверхностный вывод данных о нем и инструменты для глубокого просмотра данных и их модификации
### 4.Предусловия:
* Пользователь имеет актуальный токен, подтверждающий его авторизацию в системе
* Пользователь тем или иным способом перешел на главную страницу
### 5.Основной поток:
#### A1.Записи в дневнике есть
* Система перенаправляет пользователя на его основную страницу
* Система запрашивает и выводит последние записи и схемы лечения его дневника
#### A2.Записей в дневнике нет
* Заместо вывода записей в дневнике, система выводит заглушку, информирующую пользователя, что дневник пуст
* Система делает доступными операции с дневником
### 6.Потоки исключений:
#### B1.Записи по какой-то причине не подгрузились
* Система выводит нотификацию об ошибке и ее причине
* Заместо вывода записей, система выводит на этом месте заглушку, информирующую о неправильной работе приложения и предоставляющей для нажатия кнопку перезагрузки страницы
### 7.Постусловия
* Пользователь видит свои последние записи и может по ним кликнуть, чтобы увидеть подробную информацию
* Пользователю доступны операции добавления, модификации и удаления записей, а также схем лечения
### 8.API-Маршруты
* `GET /api/v1/User/Diaries` - получить кусок дневника пользователя (требует Authorization: Bearer <token>) query-параметры: from (int, по умолч. 0), count (int, по умолч. 20)
* `GET /api/v1/User/TreatmentSchemes` - получить кусок дневника пользователя (требует Authorization: Bearer <token>) query-параметры: from (int, по умолч. 0), count (int, по умолч. 20)
### 9.Контракт
#### Diaries-Request
##### Response - 200 - OK
```
{
diaries: [
{
"uuid": "e89b6a0c-4b0f-4722-a410-1e0c1864bf8a",
"time": "10.08.2025",
"mania_level": 1,
"depression_level": 2,
"mood_level": 3,
"activity_level": 4,
"appetite_level": 5,
"dream_level": 6,
"anxiety_level": 7,
"treatment_scheme": {
"uuid": "bf6d1555-39e9-4d73-8928-4763627f4dd5",
"treatment_name": "Bipolar I Scheme",
"instructions": "Контроль лития в крови раз в 2 месяца. Анализ крови через вену."
"medications": [
{
"uuid": "8af2dfa9-3add-413c-9a0e-ff605088f1d5",
"name": "Litii Carbonate",
"dose": 1800,
"unit": "mg",
"is_urgent": false
}
]
}
}
]
}
```
##### Errors
* `401 TOKEN_REQUIRED|TOKEN_EXPIRED` — токен недействителен, либо отсутствует
* `500 DATA_LOAD_FAILED` — ошибка при загрузке данных (`B1`)
#### TreatmentSchemes-Request
##### Response - 200 - OK
```
{
"treatment_schemes": [
{
"uuid": "248313cb-a75e-4331-8379-d3f2fc36b68d"
"treatment_name": "Bipolar I Scheme Urgent",
"instructions": "Схема для бытрого и жесткого купирования психозов. Аминазин пить каждый день.",
"medications": [
{
"uuid": "eda5a5f7-167a-44b9-900d-c5c6acfc249b",
"name": "Aminazin",
"dose": 100,
"unit": "mg",
"is_urgent": true
}
]
}
]
}
```
##### Errors
* `401 TOKEN_REQUIRED|TOKEN_EXPIRED` — токен недействителен, либо отсутствует
* `500 DATA_LOAD_FAILED` — ошибка при загрузке данных (B1)
### 10. Используемые сущности ДБ
* diaries(uuid(PK), time , mania_level , depression_level , mood_level , activity_level , appetite_level , dream_level , anxiety_level, user_treatment_schemes_uuid)
* mania(level(PK))
* depressions(level(PK))
* moods(level(PK))
* activities(level(PK))
* appetites(level(PK))
* dreams(level(PK))
* anxiety(level(PK))
* treatment_schemes(user_treatment_schemes_uuid(PK), medication_uuid(PK))
* user_treatment_schemes(uuid(PK), user_uuid, treatment_name, instructions)
* medications(uuid(PK), name, dose, unit, is_urgent)