Files
UpAndDown/README.md
T
2025-10-04 15:25:56 +03:00

12 KiB
Raw Blame History

TODO:

  • Сделать реальные исполнители(executors) для регистрации, авторизации, логаута
  • Посмотреть по поводу блокировок или тред пулла при использовании базы
  • Посмотреть пулл соединений(Object pool) при использовании базы данных(посмотреть api MySQL-Connector)
  • Посмотреть, что дает MySQL, какие там есть возможность
  • Посмотреть и подумать, что лучше - корутины или многопоточность?
  • Покрыть тестами класс User и AuthRegistrationExecutor

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": {
    "guid": "51351bb1-7563-479d-a8e9-201d0ff934c2"
    "login": "ivan_89"
  }
}
Errors
  • 409 USER_EXISTS — пользователь с таким логином уже есть(B1)
  • 422 VALIDATION_FAILED — пустой логин/неправильный пароль(B2)
  • 400 BAD_REQUEST — сервер не смог десереализовать JSON

10. Используемые сущности ДБ

  • users(guid(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 — неверный логин/пароль (А1)
  • 422 VALIDATION_FAILED — пустые поля (А2)

Logout-Request

{
  "token": af32df3bas739f272bd109c823
}
Response - 200 - OK
null

10. Используемые сущности ДБ

  • users(guid(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 ) query-параметры: from (int, по умолч. 0), count (int, по умолч. 20)
  • GET /api/v1/User/TreatmentSchemes - получить кусок дневника пользователя (требует Authorization: Bearer ) query-параметры: from (int, по умолч. 0), count (int, по умолч. 20)

9.Контракт

Diaries-Request

Response - 200 - OK
{
  diaries: [
    {
      "guid": "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": {
        "guid": "bf6d1555-39e9-4d73-8928-4763627f4dd5",
        "treatment_name": "Bipolar I Scheme",
        "instructions": "Контроль лития в крови раз в 2 месяца. Анализ крови через вену."
        "medications": [
          {
            "guid": "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": [
    {
      "guid": "248313cb-a75e-4331-8379-d3f2fc36b68d"
      "treatment_name": "Bipolar I Scheme Urgent",
      "instructions": "Схема для бытрого и жесткого купирования психозов. Аминазин пить каждый день.",
      "medications": [
        {
          "guid": "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(guid(PK), time , mania_level , depression_level , mood_level , activity_level , appetite_level , dream_level , anxiety_level, user_treatment_schemes_guid)
  • 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_guid(PK), medication_guid(PK))
  • user_treatment_schemes(guid(PK), user_guid, treatment_name, instructions)
  • medications(guid(PK), name, dose, unit, is_urgent)