diff src/lib/Uploadcare.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/Uploadcare.luan	Fri Jul 11 20:57:49 2025 -0600
@@ -0,0 +1,109 @@
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local ipairs = Luan.ipairs or error()
+local parse = Luan.parse or error()
+local stringify = Luan.stringify or error()
+local Io = require "luan:Io.luan"
+local uri = Io.uri or error()
+local Parsers = require "luan:Parsers.luan"
+local json_parse = Parsers.json_parse or error()
+local Time = require "luan:Time.luan"
+local time_now = Time.now or error()
+local parse_time = Time.parse or error()
+local Utils = require "site:/lib/Utils.luan"
+local list_to_set = Utils.list_to_set or error()
+local Config = require "site:/private/Config.luan"
+local keys = Config.uploadcare or error()
+local Logging = require "luan:logging/Logging.luan"
+local logger = Logging.logger "Uploadcare"
+
+
+local Uploadcare = {}
+
+function Uploadcare.url(uuid)
+	uuid or error()
+	return "https://ucarecdn.com/"..uuid.."/-/quality/smart/"
+end
+
+function Uploadcare.thumb_url(uuid)
+	uuid or error()
+	return "https://ucarecdn.com/"..uuid.."/-/crop/1:1/-/preview/400x400/-/quality/smart/"
+end
+
+local function used_uuids()
+	local list = {}
+
+	local Pic = require "site:/lib/Pic.luan"
+	local pics = Pic.search("type:pic")
+	for _, pic in ipairs(pics) do
+		list[#list+1] = pic.uuid
+	end
+
+	local User = require "site:/lib/User.luan"
+	local users = User.search("type:user")
+	for _, user in ipairs(users) do
+		list[#list+1] = user.pic_uuid
+		local data = user.theme_data
+		if data ~= nil then
+			data = parse(data)
+			list[#list+1] = data.background_img_uuid
+		end
+	end
+
+	return list_to_set(list)
+end
+
+local headers = {
+	Accept = "application/vnd.uploadcare-v0.7+json"
+	Authorization = "Uploadcare.Simple "..keys.public_key..":"..keys.secret_key
+}
+
+local delete_options = {
+	method = "DELETE"
+	headers = headers
+}
+
+local function delete(uuid)
+	local url = "https://api.uploadcare.com/files/"..uuid.."/storage/"
+	local result = uri(url,delete_options).read_text()
+end
+
+local options = {
+	headers = headers
+}
+
+local date_ptn = "yyyy-MM-dd'T'HH:mm:ss"
+local day = Time.period{days=1}
+
+function Uploadcare.gc()
+	logger.warn "start gc"
+	local used = used_uuids()
+	local count = 0
+	local url = "https://api.uploadcare.com/files/?limit=1000"
+	while url ~= nil do
+		local result = uri(url,options).read_text()
+		result = json_parse(result)
+		-- logger.info(stringify(result))
+		local results = result.results or error()
+		local now = time_now()
+		for _, r in ipairs(results) do
+			count = count + 1
+			local uuid = r.uuid or error()
+			local datetime_uploaded = r.datetime_uploaded or error()
+			local date = parse_time( date_ptn, datetime_uploaded, "GMT" )
+			if used[uuid] then
+				-- logger.info(uuid.." is in use")
+			elseif now - date < day  then
+				logger.info(uuid.." is less than a day old")
+			else
+				logger.warn(uuid.." delete")
+				delete(uuid)
+			end
+		end
+		url = result.next
+	end
+	logger.info("count = "..count)
+	logger.warn "end gc"
+end
+
+return Uploadcare