2
0
mirror of https://github.com/koreader/koreader synced 2024-11-13 19:11:25 +00:00
koreader/plugins/evernote.koplugin/JoplinClient.lua
NiLuJe 2f9db25969
Unify LuaSocket usage (#7405)
* Add a new socketutil module with a few helper functions that allow us to:
  * Always use a sane User-Agent (previously, only Wikipedia did so)
  * Set timeouts in an almost sane manner. Doing it explicitly prevents an interaction with KOSync that does crazy stuff I don't even want to try to understand.
* Unified said timeouts based on the request's intended usage (except for Wikipedia, which already had meaningful timeout values).
* Stopped using LuaSec directly, LuaSocket defers to LuaSec sanely on its own. Everything now transparently supports HTTPS without code duplication.
2021-03-15 01:25:10 +01:00

155 lines
4.1 KiB
Lua

local http = require("socket.http")
local json = require("json")
local ltn12 = require("ltn12")
local socketutil = require("socketutil")
local JoplinClient = {
server_ip = "localhost",
server_port = 41184,
auth_token = ""
}
function JoplinClient:new(o)
o = o or {}
self.__index = self
setmetatable(o, self)
return o
end
function JoplinClient:_makeRequest(url, method, request_body)
local sink = {}
local request_body_json = json.encode(request_body)
local source = ltn12.source.string(request_body_json)
socketutil:set_timeout(socketutil.LARGE_BLOCK_TIMEOUT, socketutil.LARGE_TOTAL_TIMEOUT)
http.request{
url = url,
method = method,
sink = ltn12.sink.table(sink),
source = source,
headers = {
["Content-Length"] = #request_body_json,
["Content-Type"] = "application/json"
},
}
socketutil:reset_timeout()
if not sink[1] then
error("No response from Joplin Server")
end
local response = json.decode(sink[1])
if response.error then
error(response.error)
end
return response
end
function JoplinClient:ping()
local sink = {}
http.request{
url = "http://"..self.server_ip..":"..self.server_port.."/ping",
method = "GET",
sink = ltn12.sink.table(sink)
}
if sink[1] == "JoplinClipperServer" then
return true
else
return false
end
end
-- If successful returns id of found note.
function JoplinClient:findNoteByTitle(title, notebook_id)
local url_base = "http://"..self.server_ip..":"..self.server_port.."/notes?".."token="..self.auth_token.."&fields=id,title,parent_id&page="
local url
local page = 1
local has_more
repeat
url = url_base..page
local notes = self:_makeRequest(url, "GET")
has_more = notes.has_more
for _, note in ipairs(notes.items) do
if note.title == title then
if notebook_id == nil or note.parent_id == notebook_id then
return note.id
end
end
end
page = page + 1
until not has_more
return false
end
-- If successful returns id of found notebook (folder).
function JoplinClient:findNotebookByTitle(title)
local url_base = "http://"..self.server_ip..":"..self.server_port.."/folders?".."token="..self.auth_token.."&".."query="..title.."&page="
local url
local page = 1
local has_more
repeat
url = url_base..page
local folders = self:_makeRequest(url, "GET")
has_more = folders.has_more
for _, folder in ipairs(folders.items) do
if folder.title == title then
return folder.id
end
end
page = page + 1
until not has_more
return false
end
-- If successful returns id of created notebook (folder).
function JoplinClient:createNotebook(title, created_time)
local request_body = {
title = title,
created_time = created_time
}
local url = "http://"..self.server_ip..":"..self.server_port.."/folders?".."token="..self.auth_token
local response = self:_makeRequest(url, "POST", request_body)
return response.id
end
-- If successful returns id of created note.
function JoplinClient:createNote(title, note, parent_id, created_time)
local request_body = {
title = title,
body = note,
parent_id = parent_id,
created_time = created_time
}
local url = "http://"..self.server_ip..":"..self.server_port.."/notes?".."token="..self.auth_token
local response = self:_makeRequest(url, "POST", request_body)
return response.id
end
-- If successful returns id of updated note.
function JoplinClient:updateNote(note_id, note, title, parent_id)
local request_body = {
body = note,
title = title,
parent_id = parent_id
}
local url = "http://"..self.server_ip..":"..self.server_port.."/notes/"..note_id.."?token="..self.auth_token
local response = self:_makeRequest(url, "PUT", request_body)
return response.id
end
return JoplinClient