website/server/libs/xmlMarshaller.js
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,
},
});
}