Giter VIP home page Giter VIP logo

gophermart's Introduction

codecov

Event stroming накопительная система лояльности «Гофермарт»

doc/img_1.png
https://miro.com/app/board/uXjVKJX4m7E=/?share_link_id=670000264537

Таблицы бд

erDiagram
User ||--|| UserBalance: userId
User ||--o{ Order: userId
Order ||--|| Accrual: orderId
Order ||--o{ Withdrawal: orderId

User {
    int id PK
    string login UK
    string password
}

UserBalance {
    int userId PK
    double accrual
    double withdrawal
}

Order {
    int id PK
    int userId FK
    string number UK
    timestamp createdAt 
}

Accrual {
    int orderId PK
    enum status
    double value
    timestamp createdAt
    timestamp updatedAt
}

Withdrawal {
    int id PK
    int userId FK
    int orderId FK
    double value
    timestamp createdAt
}
Loading

Диаграмма последовательности для операции загрузки заказа

sequenceDiagram
    participant Client
    participant LoyaltySystem
    participant DB
    participant ScoringSystem
    
    Client->>LoyaltySystem: Загрузить заказ
    activate LoyaltySystem
    Note over LoyaltySystem,DB: Проверить существование пользователя
    LoyaltySystem->>DB: Открываем транзакцию. Создаем запись в таблице Order и в таблице Accrual в статусе Processing. 
    deactivate LoyaltySystem
       loop Пока не получим данные со статусом PROCESSED, INVALID, либо что заказ не зарегистрирован 
          LoyaltySystem->>ScoringSystem: Асинхронно делаем запрос по номеру заказа
          activate ScoringSystem
          alt Заказ найден
                  ScoringSystem->>LoyaltySystem: 200 возвращаем данные по заказу 
          else Заказ не найден
                  ScoringSystem->>LoyaltySystem: 204 заказ не зарегистрирован
          end
          deactivate ScoringSystem
       end
    activate LoyaltySystem
    alt Получили ответ в статусе PROCESSED
        LoyaltySystem->>DB: Блокируем баланс UserBalance, переводим Accrual в статус PROCESSED записываем в поле value значение из ответа сервиса расчета вознаграждений. Затем увеличиваем баланс и закрываем транзакцию. 
    else Получили ответ в статусе INVALID
        LoyaltySystem->>DB: Переводим Accrual в статус INVALID и закрываем транзакцию
    end
    deactivate LoyaltySystem
    LoyaltySystem->>Client: Возвращаем результат операции
Loading

Диаграмма последовательности для операции вывода баллов

sequenceDiagram
    participant Client
    participant LoyaltySystem
    participant DB
    
    Client->>LoyaltySystem: Запрос на вывод баллов
    Note over LoyaltySystem,DB: Проверить существование пользователя + проверить что заказ принадлежит ему
    LoyaltySystem->>DB: Открываем транзакцию.Блокируем счет UserBalance получаем текущий баланс
    alt Если баллов на счету достаточно для вывода
        LoyaltySystem->>DB: Создаем запись в Withdrawal, уменьшаем в UserBalance поле accrual увеличиваем withdrawal
        LoyaltySystem->>Client: Возвращаем успешный ответ
    else Если баллов недостаточно
        LoyaltySystem->>DB: Откатываем транзакцию
        LoyaltySystem->>Client: Возвращаем ошибку
    end
Loading

gophermart's People

Contributors

dcwk avatar

Watchers

 avatar Artyom Tetyukhin avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.