ENH - add standalone framework and inventory bridges

This commit is contained in:
DerEchteAlec
2026-08-05 20:14:47 +02:00
parent 13ddeb893b
commit b9ca1f1153
28 changed files with 1552 additions and 207 deletions
+35 -36
View File
@@ -1,6 +1,4 @@
if not Sky.DB.AwaitMigrations("sky_phone") then
error("[sky_phone] Mail database migrations did not complete.")
end
Bridge.Database.AfterMigration("sky_phone", function()
local function trim(value)
if type(value) ~= "string" then
@@ -15,7 +13,7 @@ local function validate_payload(source, operation, value)
return value
end
Sky.Debug(
Bridge.Debug(
"warn",
"[sky_phone] Invalid mail payload for %s from source %s.",
operation,
@@ -98,7 +96,7 @@ local function require_session(source)
end
local function new_database_id()
local rows = Sky.Query("SELECT UUID() AS id", {})
local rows = Bridge.Database.Query("SELECT UUID() AS id", {})
if not rows[1] or type(rows[1].id) ~= "string" then
error("[sky_phone] Database did not generate a mail id.")
end
@@ -111,7 +109,7 @@ local function notify_account(account_id, event_name, data)
end
local function get_counts(account_id)
local rows = Sky.Query([[
local rows = Bridge.Database.Query([[
SELECT
SUM(CASE WHEN `folder` = 'inbox' AND `trashed_at` IS NULL AND `read_at` IS NULL THEN 1 ELSE 0 END) AS unread,
SUM(CASE WHEN `folder` = 'inbox' AND `trashed_at` IS NULL THEN 1 ELSE 0 END) AS inbox,
@@ -120,7 +118,7 @@ local function get_counts(account_id)
FROM `sky_phone_mail_entries`
WHERE `account_id` = ?
]], { account_id })
local drafts = Sky.Query(
local drafts = Bridge.Database.Query(
"SELECT COUNT(*) AS count FROM `sky_phone_mail_drafts` WHERE `account_id` = ?",
{ account_id }
)
@@ -141,7 +139,7 @@ local function broadcast_mailbox_changed(account_id, counts)
})
end
Sky.Cb.Register("sky_phone:mail:counts", function(source)
Bridge.Callbacks.Register("sky_phone:mail:counts", function(source)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -150,7 +148,7 @@ Sky.Cb.Register("sky_phone:mail:counts", function(source)
return { success = true, data = get_counts(session.id) }
end)
Sky.Cb.Register("sky_phone:mail:list", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:list", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -176,7 +174,7 @@ Sky.Cb.Register("sky_phone:mail:list", function(source, data)
if folder == "drafts" then
local pattern = "%" .. search .. "%"
rows = Sky.Query([[
rows = Bridge.Database.Query([[
SELECT `id`, `recipients`, `subject`, LEFT(`body`, 180) AS `preview`, `updated_at` AS `created_at`
FROM `sky_phone_mail_drafts`
WHERE `account_id` = ? AND (? = '' OR `subject` LIKE ? OR `body` LIKE ? OR `recipients` LIKE ?)
@@ -202,7 +200,7 @@ Sky.Cb.Register("sky_phone:mail:list", function(source, data)
values[#values + 1] = limit
values[#values + 1] = offset
rows = Sky.Query(([[
rows = Bridge.Database.Query(([[
SELECT e.`id`, e.`folder`, e.`read_at`, e.`trashed_at`, m.`id` AS `message_id`,
sender.`email` AS `sender`, m.`recipients`, m.`subject`, LEFT(m.`body`, 180) AS `preview`,
m.`created_at`
@@ -232,7 +230,7 @@ Sky.Cb.Register("sky_phone:mail:list", function(source, data)
}
end)
Sky.Cb.Register("sky_phone:mail:get", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:get", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -248,7 +246,7 @@ Sky.Cb.Register("sky_phone:mail:get", function(source, data)
return { success = false, error = "invalid_message" }
end
local rows = Sky.Query([[
local rows = Bridge.Database.Query([[
SELECT e.`id`, e.`folder`, e.`read_at`, e.`trashed_at`, m.`id` AS `message_id`,
sender.`email` AS `sender`, m.`recipients`, m.`subject`, m.`body`, m.`created_at`
FROM `sky_phone_mail_entries` e
@@ -262,7 +260,7 @@ Sky.Cb.Register("sky_phone:mail:get", function(source, data)
end
if not rows[1].read_at then
Sky.Query(
Bridge.Database.Query(
"UPDATE `sky_phone_mail_entries` SET `read_at` = CURRENT_TIMESTAMP WHERE `id` = ? AND `account_id` = ?",
{ entry_id, session.id }
)
@@ -276,7 +274,7 @@ Sky.Cb.Register("sky_phone:mail:get", function(source, data)
return { success = true, data = rows[1] }
end)
Sky.Cb.Register("sky_phone:mail:get-draft", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:get-draft", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -292,7 +290,7 @@ Sky.Cb.Register("sky_phone:mail:get-draft", function(source, data)
return { success = false, error = "invalid_draft" }
end
local rows = Sky.Query([[
local rows = Bridge.Database.Query([[
SELECT `id`, `recipients`, `subject`, `body`, `created_at`, `updated_at`
FROM `sky_phone_mail_drafts`
WHERE `id` = ? AND `account_id` = ?
@@ -306,7 +304,7 @@ Sky.Cb.Register("sky_phone:mail:get-draft", function(source, data)
return { success = true, data = rows[1] }
end)
Sky.Cb.Register("sky_phone:mail:save-draft", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:save-draft", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -332,7 +330,7 @@ Sky.Cb.Register("sky_phone:mail:save-draft", function(source, data)
end
if id then
local result = Sky.Query([[
local result = Bridge.Database.Query([[
UPDATE `sky_phone_mail_drafts`
SET `recipients` = ?, `subject` = ?, `body` = ?, `updated_at` = CURRENT_TIMESTAMP
WHERE `id` = ? AND `account_id` = ?
@@ -342,7 +340,7 @@ Sky.Cb.Register("sky_phone:mail:save-draft", function(source, data)
end
else
id = new_database_id()
Sky.Query([[
Bridge.Database.Query([[
INSERT INTO `sky_phone_mail_drafts` (`id`, `account_id`, `recipients`, `subject`, `body`)
VALUES (?, ?, ?, ?, ?)
]], { id, session.id, json.encode(recipients), subject, body })
@@ -352,7 +350,7 @@ Sky.Cb.Register("sky_phone:mail:save-draft", function(source, data)
return { success = true, data = { id = id } }
end)
Sky.Cb.Register("sky_phone:mail:delete-draft", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:delete-draft", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -368,15 +366,16 @@ Sky.Cb.Register("sky_phone:mail:delete-draft", function(source, data)
return { success = false, error = "invalid_draft" }
end
Sky.Query(
Bridge.Database.Query(
"DELETE FROM `sky_phone_mail_drafts` WHERE `id` = ? AND `account_id` = ?",
{ id, session.id }
)
broadcast_mailbox_changed(session.id)
return { success = true }
end)
end)
Sky.Cb.Register("sky_phone:mail:send", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:send", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -402,7 +401,7 @@ Sky.Cb.Register("sky_phone:mail:send", function(source, data)
for index = 1, #recipients do
placeholders[index] = "?"
end
local recipient_accounts = Sky.Query(
local recipient_accounts = Bridge.Database.Query(
("SELECT `id`, `email` FROM `sky_phone_accounts` WHERE `email` IN (%s)"):format(table.concat(placeholders, ", ")),
recipients
)
@@ -444,7 +443,7 @@ Sky.Cb.Register("sky_phone:mail:send", function(source, data)
}
end
if not Sky.DB.Transaction(statements) then
if not Bridge.Database.Transaction(statements) then
return { success = false, error = "request_failed" }
end
@@ -462,7 +461,7 @@ Sky.Cb.Register("sky_phone:mail:send", function(source, data)
return { success = true, data = { id = message_id } }
end)
Sky.Cb.Register("sky_phone:mail:set-read", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:set-read", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -478,7 +477,7 @@ Sky.Cb.Register("sky_phone:mail:set-read", function(source, data)
return { success = false, error = "invalid_message" }
end
Sky.Query(
Bridge.Database.Query(
("UPDATE `sky_phone_mail_entries` SET `read_at` = %s WHERE `id` = ? AND `account_id` = ?")
:format(data.read and "CURRENT_TIMESTAMP" or "NULL"),
{ id, session.id }
@@ -487,7 +486,7 @@ Sky.Cb.Register("sky_phone:mail:set-read", function(source, data)
return { success = true }
end)
Sky.Cb.Register("sky_phone:mail:trash", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:trash", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -503,7 +502,7 @@ Sky.Cb.Register("sky_phone:mail:trash", function(source, data)
return { success = false, error = "invalid_message" }
end
Sky.Query([[
Bridge.Database.Query([[
UPDATE `sky_phone_mail_entries` SET `trashed_at` = CURRENT_TIMESTAMP
WHERE `id` = ? AND `account_id` = ? AND `trashed_at` IS NULL
]], { id, session.id })
@@ -511,7 +510,7 @@ Sky.Cb.Register("sky_phone:mail:trash", function(source, data)
return { success = true }
end)
Sky.Cb.Register("sky_phone:mail:restore", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:restore", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -527,7 +526,7 @@ Sky.Cb.Register("sky_phone:mail:restore", function(source, data)
return { success = false, error = "invalid_message" }
end
Sky.Query([[
Bridge.Database.Query([[
UPDATE `sky_phone_mail_entries` SET `trashed_at` = NULL
WHERE `id` = ? AND `account_id` = ? AND `trashed_at` IS NOT NULL
]], { id, session.id })
@@ -535,7 +534,7 @@ Sky.Cb.Register("sky_phone:mail:restore", function(source, data)
return { success = true }
end)
Sky.Cb.Register("sky_phone:mail:delete-forever", function(source, data)
Bridge.Callbacks.Register("sky_phone:mail:delete-forever", function(source, data)
local session, error_response = require_session(source)
if not session then
return error_response
@@ -551,11 +550,11 @@ Sky.Cb.Register("sky_phone:mail:delete-forever", function(source, data)
return { success = false, error = "invalid_message" }
end
Sky.Query([[
Bridge.Database.Query([[
DELETE FROM `sky_phone_mail_entries`
WHERE `id` = ? AND `account_id` = ? AND `trashed_at` IS NOT NULL
]], { id, session.id })
Sky.Query([[
Bridge.Database.Query([[
DELETE m FROM `sky_phone_mail_messages` m
LEFT JOIN `sky_phone_mail_entries` e ON e.`message_id` = m.`id`
WHERE e.`id` IS NULL
@@ -564,17 +563,17 @@ Sky.Cb.Register("sky_phone:mail:delete-forever", function(source, data)
return { success = true }
end)
Sky.Cb.Register("sky_phone:mail:empty-trash", function(source)
Bridge.Callbacks.Register("sky_phone:mail:empty-trash", function(source)
local session, error_response = require_session(source)
if not session then
return error_response
end
Sky.Query(
Bridge.Database.Query(
"DELETE FROM `sky_phone_mail_entries` WHERE `account_id` = ? AND `trashed_at` IS NOT NULL",
{ session.id }
)
Sky.Query([[
Bridge.Database.Query([[
DELETE m FROM `sky_phone_mail_messages` m
LEFT JOIN `sky_phone_mail_entries` e ON e.`message_id` = m.`id`
WHERE e.`id` IS NULL