| 1 | = Use-case model =
|
|---|
| 2 |
|
|---|
| 3 | The detailed pages for this phase are kept in the project's GitHub repository,
|
|---|
| 4 | [https://github.com/StefanTrsunov/bp StefanTrsunov/bp], under `docs/P3-UseCaseModel/`. Every
|
|---|
| 5 | use-case link below opens the corresponding file there.
|
|---|
| 6 |
|
|---|
| 7 | == Actors / Roles ==
|
|---|
| 8 |
|
|---|
| 9 | '''Visitor''' – Anyone using EduBerza without an account, who can look at public market
|
|---|
| 10 | information, create an account, and log in.
|
|---|
| 11 |
|
|---|
| 12 | '''Trader''' – A registered, logged-in user who deposits virtual funds, places market buy and
|
|---|
| 13 | sell orders, follows the value of their portfolio, and keeps a watchlist of assets they want to
|
|---|
| 14 | monitor.
|
|---|
| 15 |
|
|---|
| 16 | '''Market Simulator''' – An external automated system (the bot in `bots/`) that writes simulated
|
|---|
| 17 | trades and candles into the database so prices move without a connection to a real exchange.
|
|---|
| 18 |
|
|---|
| 19 | == Use-Cases ==
|
|---|
| 20 |
|
|---|
| 21 | === Visitor ===
|
|---|
| 22 |
|
|---|
| 23 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0001.md UC0001] –
|
|---|
| 24 | '''Register new account''' – Visitor creates an account with a unique username and e-mail; the
|
|---|
| 25 | password is stored as a SHA-256 hash.
|
|---|
| 26 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0002.md UC0002] –
|
|---|
| 27 | '''Log in''' – Visitor authenticates with username and password so the system treats every
|
|---|
| 28 | following action as a Trader.
|
|---|
| 29 |
|
|---|
| 30 | === Trader ===
|
|---|
| 31 |
|
|---|
| 32 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0003.md UC0003] –
|
|---|
| 33 | '''Deposit virtual funds''' – Trader tops up their virtual cash balance; the user row and the
|
|---|
| 34 | ledger are written in one transaction.
|
|---|
| 35 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0004.md UC0004] –
|
|---|
| 36 | '''Place market BUY order''' – Trader buys a crypto asset at the current market price, which
|
|---|
| 37 | debits cash and upserts the holding at a running weighted-average price.
|
|---|
| 38 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0005.md UC0005] –
|
|---|
| 39 | '''Place market SELL order''' – Trader sells part or all of a holding at the current market
|
|---|
| 40 | price, which reserves the crypto being sold, credits cash and preserves the cost basis.
|
|---|
| 41 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0006.md UC0006] –
|
|---|
| 42 | '''View portfolio and transaction history''' – Trader inspects current holdings, unrealised
|
|---|
| 43 | P/L, cash balances and the most recent ledger entries.
|
|---|
| 44 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0007.md UC0007] –
|
|---|
| 45 | '''Manage watchlist''' – Trader lists, adds and removes crypto assets on a personal watchlist,
|
|---|
| 46 | where adding an asset already on the list is a no-op.
|
|---|
| 47 |
|
|---|
| 48 | === Market Simulator ===
|
|---|
| 49 |
|
|---|
| 50 | The Market Simulator initiates no use case of its own. It participates in
|
|---|
| 51 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0004.md UC0004] and
|
|---|
| 52 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0005.md UC0005]
|
|---|
| 53 | indirectly, by keeping `project.market_trades` populated so that `project.v_latest_prices`
|
|---|
| 54 | returns a current price for every active market.
|
|---|
| 55 |
|
|---|
| 56 | == Use-case model diagram ==
|
|---|
| 57 |
|
|---|
| 58 | {{{#!comment
|
|---|
| 59 | The diagram is optional for P3. Commit the exported image to
|
|---|
| 60 | docs/P3-UseCaseModel/use_case_diagram.png and then replace this comment with:
|
|---|
| 61 |
|
|---|
| 62 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/use_case_diagram.png Use-case model diagram]
|
|---|
| 63 | }}}
|
|---|
| 64 |
|
|---|
| 65 | == Detailed Use-Cases ==
|
|---|
| 66 |
|
|---|
| 67 | The following use-cases are documented in detail, with SQL tested against the P2 database:
|
|---|
| 68 |
|
|---|
| 69 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0001.md UseCase0001] – Visitor registers a new account
|
|---|
| 70 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0002.md UseCase0002] – Visitor logs in
|
|---|
| 71 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0003.md UseCase0003] – Trader deposits virtual funds
|
|---|
| 72 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0004.md UseCase0004] – Trader places a market BUY order
|
|---|
| 73 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0005.md UseCase0005] – Trader places a market SELL order
|
|---|
| 74 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0006.md UseCase0006] – Trader views portfolio and transaction history
|
|---|
| 75 | * [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0007.md UseCase0007] – Trader manages a watchlist
|
|---|
| 76 |
|
|---|
| 77 | == Realization details on selection of the most important use cases ==
|
|---|
| 78 |
|
|---|
| 79 | This is a solo project, so '''at least 3 use cases''' are required. '''7 use cases''' are
|
|---|
| 80 | documented, for a safety margin. All seven are implemented in the P4 prototype; see
|
|---|
| 81 | [https://github.com/StefanTrsunov/bp/tree/main/server server/] for the Go source and
|
|---|
| 82 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P4-Prototype/PrototypeImplementation.md PrototypeImplementation]
|
|---|
| 83 | for the documented runs.
|
|---|
| 84 |
|
|---|
| 85 | ||=Use case=||=Importance=||=Why it was selected=||
|
|---|
| 86 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0001.md UC0001 – Register]||High||Nothing else works without it; demonstrates `INSERT` with a uniqueness check.||
|
|---|
| 87 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0002.md UC0002 – Log in]||High||Authenticates every Trader action; demonstrates `SELECT` with parameter binding.||
|
|---|
| 88 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0003.md UC0003 – Deposit]||High||Shows a multi-row transaction: `UPDATE users` plus `INSERT INTO transactions`.||
|
|---|
| 89 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0004.md UC0004 – Buy]||Very high||Core of the exchange: `INSERT orders`, `UPDATE users`, upsert `holdings`, ledger entry, market trade.||
|
|---|
| 90 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0005.md UC0005 – Sell]||Very high||Dual of Buy; demonstrates row-level `FOR UPDATE` locking, reservation of committed crypto (`holdings.reserved_quantity`) and cost-basis bookkeeping.||
|
|---|
| 91 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0006.md UC0006 – Portfolio]||High||Demonstrates joins over `holdings`, `markets` and `crypto`, and the `v_portfolio` view.||
|
|---|
| 92 | ||[https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCase0007.md UC0007 – Watchlist]||Medium||Demonstrates N–M relation handling and `ON CONFLICT` upsert semantics.||
|
|---|
| 93 |
|
|---|
| 94 | == AI usage ==
|
|---|
| 95 |
|
|---|
| 96 | AI was used in this phase and is logged in full, per the course rule for P1 onward.
|
|---|
| 97 |
|
|---|
| 98 | * '''Phase log:'''
|
|---|
| 99 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P3-UseCaseModel/UseCaseModelAIUsage.md UseCaseModelAIUsage.md]
|
|---|
| 100 | – service used, what the AI produced, and what I decided myself.
|
|---|
| 101 | * '''Full conversation transcript:'''
|
|---|
| 102 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P1-ConceptualModel/ERModelAIUsage.md ERModelAIUsage.md]
|
|---|
| 103 | – the same conversation produced the P1–P4 artefacts, so the complete prompt/response log is
|
|---|
| 104 | kept in one place. Direct links:
|
|---|
| 105 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P1-ConceptualModel/ERModelAIUsage.md#session-1--2026-04-21 Session 1 – 2026-04-21],
|
|---|
| 106 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P1-ConceptualModel/ERModelAIUsage.md#session-2--2026-08-06--2026-08-07 Session 2 – 2026-08-06/07],
|
|---|
| 107 | [https://github.com/StefanTrsunov/bp/blob/main/docs/P1-ConceptualModel/ERModelAIUsage.md#session-3--2026-09-16 Session 3 – 2026-09-16].
|
|---|
| 108 |
|
|---|
| 109 | '''Service:''' Claude Code (Anthropic), https://claude.com/claude-code – Claude subscription,
|
|---|
| 110 | model Claude Opus 4.7 (1M context) in sessions 1–2, Claude Sonnet 5 in session 3.
|
|---|
| 111 |
|
|---|
| 112 | '''In short:''' the AI proposed the actor taxonomy and drafted the seven use cases with their SQL
|
|---|
| 113 | in session 1. In session 2 the use-case model itself was '''not''' changed – the only work was
|
|---|
| 114 | re-executing every scenario, including the failure paths, against a live PostgreSQL 16 database.
|
|---|
| 115 | In session 3, UC0004 and UC0005 were revised to reserve the resource an order commits (crypto on
|
|---|
| 116 | a sell) before settling it, closing a gap where nothing stopped a second sell order from being
|
|---|
| 117 | granted crypto already promised to a first one; see
|
|---|
| 118 | [UseCaseModelAIUsage](UseCaseModelAIUsage.md#session-3--2026-09-16).
|
|---|