Mercurial Hosting > linkmystyle
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/Link.luan Fri Jul 11 20:57:49 2025 -0600 @@ -0,0 +1,100 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local ipairs = Luan.ipairs or error() +local stringify = Luan.stringify or error() +local Number = require "luan:Number.luan" +local long = Number.long or error() +local float = Number.float or error() +local Db = require "site:/lib/Db.luan" +local Logging = require "luan:logging/Logging.luan" +local logger = Logging.logger "Link" + + +local Link = {} + +local function from_doc(doc) + doc.type == "link" or error "wrong type" + return Link.new { + id = doc.id + url = doc.url + title = doc.title + owner_id = doc.link_owner_id + user_id = doc.link_user_id + order = doc.link_order + } +end + +local function to_doc(link) + return { + type = "link" + id = link.id + url = link.url or error() + title = link.title or error() + link_owner_id = long(link.owner_id) + link_user_id = long(link.user_id) + link_order = float(link.order) + } +end + +function Link.new(link) + + function link.save() + local doc = to_doc(link) + Db.save(doc) + link.id = doc.id + end + + function link.reload() + return Link.get_by_id(link.id) or error(link.id) + end + + function link.delete() + Db.run_in_transaction( function() + Db.delete("id:"..link.id) + end ) + end + + function link.move_after(prev) + local links = Link.get_owner_links(link.owner_id) + if prev == nil then + link.order = links[1].order - 1 + else + link.owner_id==prev.owner_id or error() + for i, x in ipairs(links) do + if prev.id == x.id then + if i == #links then + link.order = prev.order + 1 + else + local next = links[i+1] + link.order = (prev.order + next.order) / 2 + end + return + end + end + error() + end + end + + return link +end + +function Link.get_by_id(id) + local doc = Db.get_document("id:"..id) + return doc and from_doc(doc) +end + +local function from_docs(docs) + local links = {} + for _, doc in ipairs(docs) do + local link = from_doc(doc) + links[#links+1] = link + end + return links +end + +function Link.get_owner_links(owner_id) + local docs = Db.search("link_owner_id:"..owner_id,1,1000,{sort="link_order"}) + return from_docs(docs) +end + +return Link