payment: note that Stripe has instituted an additional 1% fee for non-US cards
[hcoop/portal.git] / link.sml
1 structure Link :> LINK =
2 struct
3
4 open Util Sql Init
5
6 type link = {id : int, usr : int, title : string, url : string, descr : string}
7
8 fun mkLinkRow [id, usr, title, url, descr] =
9 {id = C.intFromSql id, usr = C.intFromSql usr, title = C.stringFromSql title,
10 url = C.stringFromSql url, descr = C.stringFromSql descr}
11 | mkLinkRow row = rowError ("link", row)
12
13 fun lookupLink id =
14 mkLinkRow (C.oneRow (getDb ()) ($`SELECT id, usr, title, url, descr
15 FROM Link
16 WHERE id = ^(C.intToSql id)`))
17
18 fun mkLinkRow' (name :: rest) = (C.stringFromSql name, mkLinkRow rest)
19 | mkLinkRow' row = Init.rowError ("user'", row)
20
21 fun listLinks () =
22 C.map (getDb ()) mkLinkRow' ($`SELECT name, Link.id, usr, title, url, descr
23 FROM Link JOIN WebUser ON usr = WebUser.id
24 ORDER BY title`)
25
26 fun listUserLinks usr =
27 C.map (getDb ()) mkLinkRow ($`SELECT id, usr, title, url, descr
28 FROM Link
29 WHERE usr = ^(C.intToSql usr)
30 ORDER BY title`)
31
32 fun addLink (usr, title, url, descr) =
33 let
34 val db = getDb ()
35 val id = nextSeq (db, "LinkSeq")
36 in
37 C.dml db ($`INSERT INTO Link (id, usr, title, url, descr)
38 VALUES (^(C.intToSql id), ^(C.intToSql usr), ^(C.stringToSql title), ^(C.stringToSql url), ^(C.stringToSql descr))`);
39 id
40 end
41
42 fun modLink (link : link) =
43 let
44 val db = getDb ()
45 in
46 ignore (C.dml db ($`UPDATE Link SET
47 usr = ^(C.intToSql (#usr link)), title = ^(C.stringToSql (#title link)),
48 url = ^(C.stringToSql (#url link)), descr = ^(C.stringToSql (#descr link))
49 WHERE id = ^(C.intToSql (#id link))`))
50 end
51
52 fun deleteLink id =
53 ignore (C.dml (getDb ()) ($`DELETE FROM Link WHERE id = ^(C.intToSql id)`))
54
55 end