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,49 +1,78 @@
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",
"--fail",
"-X",
"POST",
config.host .. "/api/v1/auth/status",
}, function(job, return_val) }, function(job, return_val)
if return_val == 0 then if return_val == 0 then
local result_string = table.concat(job:result(), "") local result_string = table.concat(job:result(), "")
local data = vim.json.decode(result_string) local data = vim.json.decode(result_string)
callback(data or nil) callback(data or nil)
else else
vim.schedule(function() vim.notify("Failed to get user info.", vim.log.levels.ERROR) end) vim.schedule(function()
vim.notify("Failed to get user info.", vim.log.levels.ERROR)
end)
callback(nil) callback(nil)
end end
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
if filter and filter ~= "" then
-- 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 end
list_url = list_url .. "?" .. table.concat(params, "&") list_url = list_url .. "?" .. table.concat(params, "&")
run_curl({ run_curl({
'-s', '--fail', '-X', 'GET', list_url, "-s",
"--fail",
"-X",
"GET",
list_url,
}, function(job, return_val) }, function(job, return_val)
if return_val == 0 then if return_val == 0 then
local result_string = table.concat(job:result(), "") local result_string = table.concat(job:result(), "")
local data = vim.json.decode(result_string) local data = vim.json.decode(result_string)
callback({ memos = data.memos or {}, nextPageToken = data.nextPageToken or "" }) callback({ memos = data.memos or {}, nextPageToken = data.nextPageToken or "" })
else else
vim.schedule(function() vim.notify("Failed to fetch memos.", vim.log.levels.ERROR) end) vim.schedule(function()
vim.notify("Failed to fetch memos.", vim.log.levels.ERROR)
end)
callback(nil) callback(nil)
end end
end) end)
@@ -51,12 +80,18 @@ 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",
"POST",
create_url,
"-H",
"Content-Type: application/json",
"--data",
json_data,
}, function(job, return_val) }, function(job, return_val)
if return_val == 0 then if return_val == 0 then
local result_string = table.concat(job:result(), "") local result_string = table.concat(job:result(), "")
@@ -69,21 +104,31 @@ function M.create_memo(content, callback)
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",
"PATCH",
update_url,
"-H",
"Content-Type: application/json",
"--data",
json_data,
}, function(job, return_val) }, function(job, return_val)
callback(return_val == 0) callback(return_val == 0)
end) 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",
"--fail",
"-X",
"DELETE",
delete_url,
}, function(job, return_val) }, function(job, return_val)
callback(return_val == 0) callback(return_val == 0)
end) end)

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