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