view src/lib/Link.luan @ 3:b016e4b7c8da default tip

add read_me
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 12 Jul 2025 12:51:36 -0600
parents 8f4df159f06b
children
line wrap: on
line source

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