diff --git a/pages/index.html b/pages/index.html index a1fb76c..fe66c76 100644 --- a/pages/index.html +++ b/pages/index.html @@ -21,9 +21,7 @@ diff --git a/pages/invoice.html b/pages/invoice.html index a064b43..7c2d0f2 100644 --- a/pages/invoice.html +++ b/pages/invoice.html @@ -22,9 +22,7 @@ diff --git a/pages/login.html b/pages/login.html index 66bcf2f..b66fb3e 100644 --- a/pages/login.html +++ b/pages/login.html @@ -21,9 +21,7 @@ diff --git a/pages/market.html b/pages/market.html index 9024d86..96bb82c 100644 --- a/pages/market.html +++ b/pages/market.html @@ -22,9 +22,7 @@ diff --git a/pages/user.html b/pages/user.html new file mode 100644 index 0000000..f0ba665 --- /dev/null +++ b/pages/user.html @@ -0,0 +1,102 @@ + + + + + delphi.market + + + + + + + + + + {{ if eq .ENV "development" }} + + {{ end }} + + + +
+ +
+
+ + +
+ _   _ ___  ___ _ __ 
+| | | / __|/ _ \ '__|
+| |_| \__ \  __/ |   
+ \__,_|___/\___|_|   
+
+
+
+ You are: {{substr .session.Pubkey 0 8}} +
+
+ Open Orders + + + + + + + + {{ range .Orders }} + {{ if .Invoice.ConfirmedAt.Valid }} + + + + + + + {{ end }} + {{ end }} +
MarketSideShareQuantity @ Price
+ {{.Share.MarketId}} + {{.Side}}{{.Share.Description}}{{.Quantity}} @ {{.Price}}
+
+
+ Unpaid Orders + + + + + + + + + {{ range .Orders }} + {{ if not .Invoice.ConfirmedAt.Valid }} + + + + + + + + {{ end }} + {{ end }} +
MarketSideShareQuantity @ PriceInvoice
+ {{.Share.MarketId}} + {{.Side}}{{.Share.Description}}{{.Quantity}} @ {{.Price}}invoice
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/src/db.go b/src/db.go index 6330134..041e92a 100644 --- a/src/db.go +++ b/src/db.go @@ -69,22 +69,40 @@ func (db *DB) FetchShares(marketId int, shares *[]Share) error { return nil } -func (db *DB) FetchOrders(marketId int, orders *[]Order) error { - rows, err := db.Query(""+ - "SELECT o.id, share_id, o.pubkey, o.side, o.quantity, o.price, s.description, o.order_id "+ - "FROM orders o "+ - "JOIN invoices i ON o.invoice_id = i.id "+ - "JOIN shares s ON o.share_id = s.id "+ - "WHERE share_id = ANY(SELECT id FROM shares WHERE market_id = $1) "+ - "AND i.confirmed_at IS NOT NULL "+ - "ORDER BY price DESC", marketId) +type FetchOrdersWhere struct { + MarketId int + Pubkey string + Confirmed bool +} + +func (db *DB) FetchOrders(where *FetchOrdersWhere, orders *[]Order) error { + query := "" + + "SELECT o.id, share_id, o.pubkey, o.side, o.quantity, o.price, o.invoice_id, s.description, s.market_id, i.confirmed_at, o.order_id " + + "FROM orders o " + + "JOIN invoices i ON o.invoice_id = i.id " + + "JOIN shares s ON o.share_id = s.id " + + "WHERE " + var args []any + if where.MarketId > 0 { + query += "share_id = ANY(SELECT id FROM shares WHERE market_id = $1) " + args = append(args, where.MarketId) + } else if where.Pubkey != "" { + query += "o.pubkey = $1 " + args = append(args, where.Pubkey) + } + if where.Confirmed { + query += "AND i.confirmed_at IS NOT NULL " + } + query += "AND (i.confirmed_at IS NOT NULL OR i.expires_at > CURRENT_TIMESTAMP) " + query += "ORDER BY price DESC" + rows, err := db.Query(query, args...) if err != nil { return err } defer rows.Close() for rows.Next() { var order Order - rows.Scan(&order.Id, &order.ShareId, &order.Pubkey, &order.Side, &order.Quantity, &order.Price, &order.Share.Description, &order.OrderId) + rows.Scan(&order.Id, &order.ShareId, &order.Pubkey, &order.Side, &order.Quantity, &order.Price, &order.InvoiceId, &order.Share.Description, &order.Share.MarketId, &order.Invoice.ConfirmedAt, &order.OrderId) *orders = append(*orders, order) } return nil @@ -125,3 +143,7 @@ func (db *DB) ConfirmInvoice(hash string, confirmedAt time.Time, msatsReceived i } return nil } + +func (db *DB) FetchUser(pubkey string, user *User) error { + return db.QueryRow("SELECT pubkey FROM users WHERE pubkey = $1", pubkey).Scan(&user.Pubkey) +} diff --git a/src/market.go b/src/market.go index 1072e4a..2d1f63e 100644 --- a/src/market.go +++ b/src/market.go @@ -26,6 +26,8 @@ type Share struct { type Order struct { Session Share + Market + Invoice Id string ShareId string `form:"share_id"` Side string `form:"side"` @@ -131,7 +133,7 @@ func market(c echo.Context) error { return err } var orders []Order - if err = db.FetchOrders(market.Id, &orders); err != nil { + if err = db.FetchOrders(&FetchOrdersWhere{MarketId: market.Id, Confirmed: true}, &orders); err != nil { return err } data := map[string]any{ diff --git a/src/router.go b/src/router.go index 91a5db9..85dbab3 100644 --- a/src/router.go +++ b/src/router.go @@ -26,11 +26,23 @@ func div(arg1 int, arg2 int) int { return arg1 / arg2 } +func substr(s string, start, length int) string { + if start < 0 || start >= len(s) { + return "" + } + end := start + length + if end > len(s) { + end = len(s) + } + return s[start:end] +} + var ( FuncMap template.FuncMap = template.FuncMap{ - "add": add, - "sub": sub, - "div": div, + "add": add, + "sub": sub, + "div": div, + "substr": substr, } ) diff --git a/src/server.go b/src/server.go index 67f1a3e..508d9c5 100644 --- a/src/server.go +++ b/src/server.go @@ -63,6 +63,7 @@ func main() { e.GET("/api/login", verifyLogin) e.GET("/api/session", checkSession) e.POST("/logout", logout) + e.GET("/user", sessionGuard(user)) e.GET("/market/:id", sessionGuard(market)) e.POST("/market/:id/order", sessionGuard(order)) e.GET("/invoice/:id", sessionGuard(invoice)) diff --git a/src/user.go b/src/user.go new file mode 100644 index 0000000..33e3a38 --- /dev/null +++ b/src/user.go @@ -0,0 +1,29 @@ +package main + +import ( + "net/http" + + "github.com/labstack/echo/v4" +) + +type User struct { + Session +} + +func user(c echo.Context) error { + session := c.Get("session").(Session) + u := User{} + if err := db.FetchUser(session.Pubkey, &u); err != nil { + return err + } + var orders []Order + if err := db.FetchOrders(&FetchOrdersWhere{Pubkey: session.Pubkey}, &orders); err != nil { + return err + } + data := map[string]any{ + "session": c.Get("session"), + "user": u, + "Orders": orders, + } + return c.Render(http.StatusOK, "user.html", data) +}