source: server/market.go@ b715712

main
Last change on this file since b715712 was b715712, checked in by Stefan <trsunovstefan@…>, 8 weeks ago

Add the server side and configuration

  • Property mode set to 100644
File size: 2.0 KB
Line 
1package main
2
3import (
4 "database/sql"
5 "fmt"
6
7 "bp_project/server/db"
8)
9
10// Market represents a trading pair.
11type Market struct {
12 ID string
13 CryptoID string
14 Symbol string
15 Quote string
16}
17
18// ListMarkets prints all active markets with their latest price.
19func ListMarkets() {
20 rows, err := db.DB.Query(`
21 SELECT m.id, c.symbol, m.quote_currency,
22 COALESCE(lp.price, 0) AS price
23 FROM markets m
24 JOIN crypto c ON c.id = m.crypto_id
25 LEFT JOIN v_latest_prices lp ON lp.market_id = m.id
26 WHERE m.is_active = true
27 ORDER BY c.symbol`)
28 if err != nil {
29 fmt.Println("Error:", err)
30 return
31 }
32 defer rows.Close()
33
34 fmt.Println()
35 fmt.Printf(" %-4s %-8s %-5s %15s\n", "#", "Symbol", "Quote", "Last price")
36 fmt.Println(" -----------------------------------------")
37 i := 1
38 for rows.Next() {
39 var id, sym, quote string
40 var price float64
41 if err := rows.Scan(&id, &sym, &quote, &price); err != nil {
42 fmt.Println("scan error:", err)
43 return
44 }
45 fmt.Printf(" %-4d %-8s %-5s %15.6f\n", i, sym, quote, price)
46 i++
47 }
48}
49
50// ChooseMarket asks the user to pick a market by symbol and returns it.
51func ChooseMarket() (*Market, error) {
52 ListMarkets()
53 sym := prompt("Market symbol (e.g. BTC): ")
54 if sym == "" {
55 return nil, fmt.Errorf("no symbol entered")
56 }
57 var m Market
58 err := db.DB.QueryRow(`
59 SELECT m.id, c.id, c.symbol, m.quote_currency
60 FROM markets m
61 JOIN crypto c ON c.id = m.crypto_id
62 WHERE upper(c.symbol) = upper($1)
63 AND m.is_active = true
64 LIMIT 1`, sym,
65 ).Scan(&m.ID, &m.CryptoID, &m.Symbol, &m.Quote)
66 if err == sql.ErrNoRows {
67 return nil, fmt.Errorf("market %s not found", sym)
68 }
69 if err != nil {
70 return nil, err
71 }
72 return &m, nil
73}
74
75// LatestPrice returns the last traded price on a market.
76func LatestPrice(marketID string) (float64, error) {
77 var price float64
78 err := db.DB.QueryRow(
79 `SELECT price FROM v_latest_prices WHERE market_id = $1`, marketID,
80 ).Scan(&price)
81 if err == sql.ErrNoRows {
82 return 0, fmt.Errorf("no trades yet for this market")
83 }
84 return price, err
85}
Note: See TracBrowser for help on using the repository browser.