two-way sync: allow changedProperties to be null to avoid array/object issues

This commit is contained in:
Lucien Greathouse
2020-02-14 18:15:18 -08:00
parent ff47f79c62
commit 4a9c1d0d1b
2 changed files with 24 additions and 6 deletions

View File

@@ -158,19 +158,35 @@ end
function ApiContext:write(patch)
local url = ("%s/api/write"):format(self.__baseUrl)
local body = {
sessionId = self.__sessionId,
removed = patch.removed,
updated = patch.updated,
}
local updated = {}
for _, update in ipairs(patch.updated) do
local fixedUpdate = {
id = update.id,
changedName = update.changedName,
}
if next(update.changedProperties) ~= nil then
fixedUpdate.changedProperties = update.changedProperties
end
table.insert(updated, fixedUpdate)
end
-- Only add the 'added' field if the table is non-empty, or else Roblox's
-- JSON implementation will turn the table into an array instead of an
-- object, causing API validation to fail.
local added
if next(patch.added) ~= nil then
body.added = patch.added
added = patch.added
end
local body = {
sessionId = self.__sessionId,
removed = patch.removed,
updated = updated,
added = added,
}
body = Http.jsonEncode(body)
return Http.post(url, body)

View File

@@ -34,8 +34,10 @@ pub struct InstanceUpdate {
pub id: RbxId,
pub changed_name: Option<String>,
pub changed_class_name: Option<String>,
// TODO: Transform from HashMap<String, Option<_>> to something else, since
// null will get lost when decoding from JSON in some languages.
#[serde(default)]
pub changed_properties: HashMap<String, Option<RbxValue>>,
pub changed_metadata: Option<InstanceMetadata>,
}