Skip to content

User story

Aleksandr Gorohov edited this page Nov 22, 2024 · 10 revisions

User Story 1: Рекомендательная система для банка "Стар"

Описание:

Как банк "Стар", мы хотим внедрить рекомендательную систему, которая будет анализировать поведение клиентов и предлагать им персонализированные банковские продукты.

Как пользователь системы, я хочу:

  1. Анализировать транзакции:

    • Учитывать типы продуктов (DEBIT, SAVING, INVEST, CREDIT).
    • Определять суммы пополнений и трат.
  2. Определять подходящие продукты:

    • Использовать заранее заданные правила для каждого продукта.
    • Учитывать, что для рекомендации должны выполняться все правила.
  3. Предоставлять список рекомендаций:

    • Через REST API с методом GET /recommendation/<user_id>.
    • Возвращать JSON с идентификатором пользователя и списком рекомендуемых продуктов.

Функциональные требования:

  1. Анализ транзакций:

    • Получать данные из базы данных H2.
    • Анализировать транзакции для определения типов продуктов и сумм.
  2. Применение правил:

    • Использовать заранее заданные правила для каждого продукта.
    • Объединять правила логическими "И", "ИЛИ".
  3. Генерация рекомендаций:

    • Генерировать список рекомендуемых продуктов на основе выполненных правил.
    • Возвращать пустой список, если рекомендаций нет.
  4. REST API:

    • Предоставлять метод GET /recommendation/<user_id>.
    • Возвращать JSON с идентификатором пользователя и списком продуктов.

Нефункциональные требования:

  1. Производительность:

    • Обрабатывать запросы в реальном времени.
    • Оптимизировать SQL-запросы.
  2. Масштабируемость:

    • Разрабатывать с учетом возможности расширения.
    • Компоненты должны быть легко тестируемы и поддерживаемы.
  3. Безопасность:

    • Обеспечивать безопасный доступ к базе данных и API.

Пример использования:

Входные данные:

  • Идентификатор пользователя: cd515076-5d8a-44be-930e-8d4fcb79f42d

Выходные данные:

{
  "user_id": "cd515076-5d8a-44be-930e-8d4fcb79f42d",
  "recommendations": [
    {
      "name": "Invest 500",
      "id": "147f6a0f-3b91-413b-ab99-87f081d60d5a",
      "text": "Откройте свой путь к успеху с индивидуальным инвестиционным счетом (ИИС) от нашего банка! Воспользуйтесь налоговыми льготами и начните инвестировать с умом. Пополните счет до конца года и получите выгоду в виде вычета на взнос в следующем налоговом периоде. Не упустите возможность разнообразить свой портфель, снизить риски и следить за актуальными рыночными тенденциями. Откройте ИИС сегодня и станьте ближе к финансовой независимости!"
    }
  ]
}

Дополнительные требования:

  • Реализовать как Spring Boot приложение.
  • Использовать JdbcTemplate для работы с базой данных.
  • Код должен быть структурирован и легко тестируем с использованием Mockito и JUnit.

Приоритет: Высокий

Срок выполнения: До конца текущей итерации разработки.

User Story 2: Динамические правила рекомендаций для банка "Стар"

Описание:

Как банк "Стар", мы хотим расширить функциональность нашей рекомендательной системы, добавив возможность динамического создания, удаления и получения правил рекомендаций. Это позволит нам гибко адаптировать систему под изменяющиеся потребности и стратегии маркетинга.

Как пользователь системы, я хочу:

  1. Добавлять новые правила рекомендаций:

    • Создавать динамические правила, которые будут определять, какие продукты рекомендовать пользователям.
    • Каждое правило должно состоять из одного или нескольких запросов, объединенных логическим "И".
  2. Удалять существующие правила:

    • Удалять динамические правила, которые больше не актуальны или не нужны.
  3. Получать список всех правил:

    • Просматривать все созданные динамические правила для контроля и анализа.
  4. Использовать динамические правила в рекомендациях:

    • Система должна проверять выполнение динамических правил при формировании рекомендаций для пользователей.
    • Если правила выполняются, продукт, связанный с этими правилами, должен быть добавлен в список рекомендаций.

Функциональные требования:

  1. API для управления правилами:

    • Создать три метода REST API:
      • POST /rule для добавления нового правила.
      • DELETE /rule/{rule_id} для удаления правила.
      • GET /rule для получения списка всех правил.
  2. Типы запросов:

    • Поддержка четырех типов запросов:
      • USER_OF — проверка, является ли пользователь пользователем продукта.
      • ACTIVE_USER_OF — проверка, является ли пользователь активным пользователем продукта.
      • TRANSACTION_SUM_COMPARE — сравнение суммы транзакций с константой.
      • TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW — сравнение суммы пополнений с тратами по продукту.
  3. Использование динамических правил:

    • При запросе рекомендаций (GET /recommendation/{user_id}) система должна проверять выполнение всех динамических правил и добавлять соответствующие продукты в список рекомендаций.
  4. Кеширование результатов:

    • Кешировать результаты SQL-запросов к базе данных для повышения производительности.
    • Использовать библиотеку Caffeine или Spring Cache для реализации кеширования.
  5. Подключение второй базы данных:

    • Использовать PostgreSQL для хранения динамических правил.
    • Настроить подключение к PostgreSQL через Spring Data JPA.
    • Использовать Liquibase для управления миграциями базы данных.

Нефункциональные требования:

  1. Производительность:

    • Обеспечить быструю обработку запросов на добавление, удаление и получение правил.
    • Оптимизировать SQL-запросы для быстрого получения данных.
  2. Масштабируемость:

    • Система должна быть готова к расширению и поддерживать большое количество динамических правил.
  3. Безопасность:

    • Обеспечить безопасный доступ к API для управления правилами.
    • Защитить базу данных от несанкционированного доступа.

Пример использования:

Добавление нового правила:

Request:

POST /rule
{
    "product_name": "Простой кредит",
    "product_id": "ab138afb-f3ba-4a93-b74f-0fcee86d447f",
    "product_text": "<текст рекомендации>",
    "rule": [
        {
            "query": "USER_OF",
            "arguments": ["CREDIT"],
            "negate": true
        },
        {
            "query": "TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW",
            "arguments": ["DEBIT", ">"],
            "negate": false
        },
        {
            "query": "TRANSACTION_SUM_COMPARE",
            "arguments": ["DEBIT", "DEPOSIT", ">", "100000"],
            "negate": false
        }
    ]
}

Response:

200 OK
{
    "id": "<некий сгенерированный id>",
    "product_name": "Простой кредит",
    "product_id": "ab138afb-f3ba-4a93-b74f-0fcee86d447f",
    "product_text": "<текст рекомендации>",
    "rule": [
        {
            "query": "USER_OF",
            "arguments": ["CREDIT"],
            "negate": true
        },
        {
            "query": "TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW",
            "arguments": ["DEBIT", ">"],
            "negate": false
        },
        {
            "query": "TRANSACTION_SUM_COMPARE",
            "arguments": ["DEBIT", "DEPOSIT", ">", "100000"],
            "negate": false
        }
    ]
}

Получение списка всех правил:

Request:

GET /rule

Response:

200 OK
{
    "data": [
        {
            "id": "<некий сгенерированный id>",
            "product_name": "Простой кредит",
            "product_id": "ab138afb-f3ba-4a93-b74f-0fcee86d447f",
            "product_text": "<текст рекомендации>",
            "rule": [
                {
                    "query": "USER_OF",
                    "arguments": ["CREDIT"],
                    "negate": true
                },
                {
                    "query": "TRANSACTION_SUM_COMPARE_DEPOSIT_WITHDRAW",
                    "arguments": ["DEBIT", ">"],
                    "negate": false
                },
                {
                    "query": "TRANSACTION_SUM_COMPARE",
                    "arguments": ["DEBIT", "DEPOSIT", ">", "100000"],
                    "negate": false
                }
            ]
        },
        ...
    ]
}

Удаление правила:

Request:

DELETE /rule/<rule_id>

Response:

204 No Content

Приоритет: Высокий

Срок выполнения: До конца текущей итерации разработки.

Clone this wiki locally