Mercurial Hosting > linkmystyle
comparison src/lib/Link.luan @ 0:8f4df159f06b
start public repo
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 11 Jul 2025 20:57:49 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:8f4df159f06b |
---|---|
1 local Luan = require "luan:Luan.luan" | |
2 local error = Luan.error | |
3 local ipairs = Luan.ipairs or error() | |
4 local stringify = Luan.stringify or error() | |
5 local Number = require "luan:Number.luan" | |
6 local long = Number.long or error() | |
7 local float = Number.float or error() | |
8 local Db = require "site:/lib/Db.luan" | |
9 local Logging = require "luan:logging/Logging.luan" | |
10 local logger = Logging.logger "Link" | |
11 | |
12 | |
13 local Link = {} | |
14 | |
15 local function from_doc(doc) | |
16 doc.type == "link" or error "wrong type" | |
17 return Link.new { | |
18 id = doc.id | |
19 url = doc.url | |
20 title = doc.title | |
21 owner_id = doc.link_owner_id | |
22 user_id = doc.link_user_id | |
23 order = doc.link_order | |
24 } | |
25 end | |
26 | |
27 local function to_doc(link) | |
28 return { | |
29 type = "link" | |
30 id = link.id | |
31 url = link.url or error() | |
32 title = link.title or error() | |
33 link_owner_id = long(link.owner_id) | |
34 link_user_id = long(link.user_id) | |
35 link_order = float(link.order) | |
36 } | |
37 end | |
38 | |
39 function Link.new(link) | |
40 | |
41 function link.save() | |
42 local doc = to_doc(link) | |
43 Db.save(doc) | |
44 link.id = doc.id | |
45 end | |
46 | |
47 function link.reload() | |
48 return Link.get_by_id(link.id) or error(link.id) | |
49 end | |
50 | |
51 function link.delete() | |
52 Db.run_in_transaction( function() | |
53 Db.delete("id:"..link.id) | |
54 end ) | |
55 end | |
56 | |
57 function link.move_after(prev) | |
58 local links = Link.get_owner_links(link.owner_id) | |
59 if prev == nil then | |
60 link.order = links[1].order - 1 | |
61 else | |
62 link.owner_id==prev.owner_id or error() | |
63 for i, x in ipairs(links) do | |
64 if prev.id == x.id then | |
65 if i == #links then | |
66 link.order = prev.order + 1 | |
67 else | |
68 local next = links[i+1] | |
69 link.order = (prev.order + next.order) / 2 | |
70 end | |
71 return | |
72 end | |
73 end | |
74 error() | |
75 end | |
76 end | |
77 | |
78 return link | |
79 end | |
80 | |
81 function Link.get_by_id(id) | |
82 local doc = Db.get_document("id:"..id) | |
83 return doc and from_doc(doc) | |
84 end | |
85 | |
86 local function from_docs(docs) | |
87 local links = {} | |
88 for _, doc in ipairs(docs) do | |
89 local link = from_doc(doc) | |
90 links[#links+1] = link | |
91 end | |
92 return links | |
93 end | |
94 | |
95 function Link.get_owner_links(owner_id) | |
96 local docs = Db.search("link_owner_id:"..owner_id,1,1000,{sort="link_order"}) | |
97 return from_docs(docs) | |
98 end | |
99 | |
100 return Link |