This commit is contained in:
Elflare
2025-12-05 12:59:17 +08:00
parent 56c2c26fc1
commit 1d478708ad
2 changed files with 117 additions and 68 deletions

View File

@@ -1,92 +1,137 @@
local Job = require('plenary.job') local Job = require("plenary.job")
local config = require('memos').config local config = require("memos").config
local M = {} local M = {}
-- 【新增】URL 编码辅助函数
local function url_encode(str)
if str then
str = string.gsub(str, "\n", "\r\n")
str = string.gsub(str, "([^%w %-%_%.%~])", function(c)
return string.format("%%%02X", string.byte(c))
end)
str = string.gsub(str, " ", "%%20")
end
return str
end
local function run_curl(args, on_exit) local function run_curl(args, on_exit)
table.insert(args, '-H') table.insert(args, "-H")
table.insert(args, 'Authorization: Bearer ' .. config.token) table.insert(args, "Authorization: Bearer " .. config.token)
Job:new({ command = 'curl', args = args, on_exit = on_exit }):start() Job:new({ command = "curl", args = args, on_exit = on_exit }):start()
end end
function M.get_current_user(callback) function M.get_current_user(callback)
run_curl({ run_curl({
'-s', '--fail', '-X', 'POST', config.host .. '/api/v1/auth/status', "-s",
}, function(job, return_val) "--fail",
if return_val == 0 then "-X",
local result_string = table.concat(job:result(), "") "POST",
local data = vim.json.decode(result_string) config.host .. "/api/v1/auth/status",
callback(data or nil) }, function(job, return_val)
else if return_val == 0 then
vim.schedule(function() vim.notify("Failed to get user info.", vim.log.levels.ERROR) end) local result_string = table.concat(job:result(), "")
callback(nil) local data = vim.json.decode(result_string)
end callback(data or nil)
end) else
vim.schedule(function()
vim.notify("Failed to get user info.", vim.log.levels.ERROR)
end)
callback(nil)
end
end)
end end
function M.list_memos(parent, filter, page_size, pageToken, callback) function M.list_memos(parent, filter, page_size, pageToken, callback)
local list_url = config.host .. '/api/v1/memos' local list_url = config.host .. "/api/v1/memos"
local params = {} local params = {}
table.insert(params, "parent=" .. parent) table.insert(params, "parent=" .. parent)
table.insert(params, "page_size=" .. tostring(page_size)) table.insert(params, "page_size=" .. tostring(page_size))
if pageToken and pageToken ~= "" then table.insert(params, "pageToken=" .. pageToken) end if pageToken and pageToken ~= "" then
if filter and filter ~= '' then table.insert(params, "pageToken=" .. pageToken)
table.insert(params, 'filter=content.contains("' .. vim.fn.escape(filter, '\\"') .. '")') end
end if filter and filter ~= "" then
list_url = list_url .. "?" .. table.concat(params, "&") -- 1. 构造原始的过滤字符串例如content.contains("hello world")
local raw_filter = 'content.contains("' .. vim.fn.escape(filter, '"') .. '")'
-- 2. 对整个值进行 URL 编码变成content.contains%28%22hello%20world%22%29
table.insert(params, "filter=" .. url_encode(raw_filter))
end
list_url = list_url .. "?" .. table.concat(params, "&")
run_curl({ run_curl({
'-s', '--fail', '-X', 'GET', list_url, "-s",
}, function(job, return_val) "--fail",
if return_val == 0 then "-X",
local result_string = table.concat(job:result(), "") "GET",
local data = vim.json.decode(result_string) list_url,
callback({ memos = data.memos or {}, nextPageToken = data.nextPageToken or "" }) }, function(job, return_val)
else if return_val == 0 then
vim.schedule(function() vim.notify("Failed to fetch memos.", vim.log.levels.ERROR) end) local result_string = table.concat(job:result(), "")
callback(nil) local data = vim.json.decode(result_string)
end callback({ memos = data.memos or {}, nextPageToken = data.nextPageToken or "" })
end) else
vim.schedule(function()
vim.notify("Failed to fetch memos.", vim.log.levels.ERROR)
end)
callback(nil)
end
end)
end end
-- 【修改】让 create_memo 的回调函数返回新创建的 memo 对象 -- 【修改】让 create_memo 的回调函数返回新创建的 memo 对象
function M.create_memo(content, callback) function M.create_memo(content, callback)
local create_url = config.host .. '/api/v1/memos' local create_url = config.host .. "/api/v1/memos"
local json_data = vim.json.encode({ content = content }) local json_data = vim.json.encode({ content = content })
run_curl({ run_curl({
'-s', '--fail', '-X', 'POST', create_url, "-s",
'-H', 'Content-Type: application/json', "--fail",
'--data', json_data, "-X",
}, function(job, return_val) "POST",
if return_val == 0 then create_url,
local result_string = table.concat(job:result(), "") "-H",
local new_memo = vim.json.decode(result_string) "Content-Type: application/json",
callback(new_memo) "--data",
else json_data,
callback(nil) }, function(job, return_val)
end if return_val == 0 then
end) local result_string = table.concat(job:result(), "")
local new_memo = vim.json.decode(result_string)
callback(new_memo)
else
callback(nil)
end
end)
end end
function M.update_memo(memo_name, content, callback) function M.update_memo(memo_name, content, callback)
local update_url = config.host .. '/api/v1/' .. memo_name local update_url = config.host .. "/api/v1/" .. memo_name
local json_data = vim.json.encode({ content = content }) local json_data = vim.json.encode({ content = content })
run_curl({ run_curl({
'-s', '--fail', '-X', 'PATCH', update_url, "-s",
'-H', 'Content-Type: application/json', "--fail",
'--data', json_data, "-X",
}, function(job, return_val) "PATCH",
callback(return_val == 0) update_url,
end) "-H",
"Content-Type: application/json",
"--data",
json_data,
}, function(job, return_val)
callback(return_val == 0)
end)
end end
function M.delete_memo(memo_name, callback) function M.delete_memo(memo_name, callback)
local delete_url = config.host .. '/api/v1/' .. memo_name local delete_url = config.host .. "/api/v1/" .. memo_name
run_curl({ run_curl({
'-s', '--fail', '-X', 'DELETE', delete_url, "-s",
}, function(job, return_val) "--fail",
callback(return_val == 0) "-X",
end) "DELETE",
delete_url,
}, function(job, return_val)
callback(return_val == 0)
end)
end end
return M return M

View File

@@ -14,6 +14,10 @@ function M.render_memos(data, append)
if not buf_id or not vim.api.nvim_buf_is_valid(buf_id) then if not buf_id or not vim.api.nvim_buf_is_valid(buf_id) then
return return
end end
if not data then
vim.notify("API returned no data.", vim.log.levels.WARN)
return
end
local new_memos = data.memos or {} local new_memos = data.memos or {}
current_page_token = data.nextPageToken or "" current_page_token = data.nextPageToken or ""
if append then if append then