Files
habitica/website/server/libs/xmlMarshaller.js
John Li d132b057eb Fix XML Data Export Error by Modifying XML Format (#13942)
* Added XML code to parse json + convert formatting before exporting as XML + XML Marshall tests

* Add linting fixes

linting errors still present in xmlMarshaller.test.js but, certain keys starting with digits (for example '800ed0') must be enclosed in quotes , so to maintain consistency within the test file I kept all keys enclosed by single quotes.

* fix(lint): unquote, EOF

Co-authored-by: SabreCat <sabe@habitica.com>
2022-05-12 15:24:17 -05:00

60 lines
1.7 KiB
JavaScript

import _ from 'lodash';
import * as js2xml from 'js2xmlparser';
export function marshallUserData (userData) {
// object maps can't be marshalled to XML
userData.inbox.messages = _(userData.inbox.messages)
.map(m => {
m.flags = Object.keys(m.flags);
return m;
})
.value();
userData.newMessages = _.map(userData.newMessages, (msg, id) => ({ id, ...msg }));
// _id gets parsed as a bytearray => which gets cast to a chararray => "weird chars"
userData.unpinnedItems = userData.unpinnedItems.map(i => ({
path: i.path,
type: i.type,
}));
userData.pinnedItems = userData.pinnedItems.map(i => ({
path: i.path,
type: i.type,
}));
const copyUserData = JSON.parse(JSON.stringify(userData));
const newPurchased = {};
if (userData.purchased != null) {
for (const itemType in userData.purchased) {
if (userData.purchased[itemType] != null) {
if (typeof userData.purchased[itemType] === 'object') {
const fixedData = [];
for (const item in userData.purchased[itemType]) {
if (item != null) {
if (typeof userData.purchased[itemType][item] === 'object') {
fixedData.push({ item: userData.purchased[itemType][item] });
} else {
fixedData.push(item);
}
}
}
newPurchased[itemType] = fixedData;
} else {
newPurchased[itemType] = userData.purchased[itemType];
}
}
}
copyUserData.purchased = newPurchased;
}
return js2xml.parse('user', copyUserData, {
cdataInvalidChars: true,
replaceInvalidChars: true,
declaration: {
include: false,
},
});
}