view src/lib/Uploadcare.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 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