mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
fix xml export (#10505)
* add /export webpack-proxy - fix xml export * fix lint / add xmlMode
This commit is contained in:
@@ -23,6 +23,17 @@ describe('GET /export/userdata.xml', () => {
|
|||||||
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// add pinnedItem
|
||||||
|
await user.get('/user/toggle-pinned-item/marketGear/gear.flat.shield_rogue_5');
|
||||||
|
|
||||||
|
// add a private message
|
||||||
|
let receiver = await generateUser();
|
||||||
|
|
||||||
|
user.post('/members/send-private-message', {
|
||||||
|
message: 'Your first message, hi!',
|
||||||
|
toUserId: receiver._id,
|
||||||
|
});
|
||||||
|
|
||||||
let response = await user.get('/export/userdata.xml');
|
let response = await user.get('/export/userdata.xml');
|
||||||
let {user: res} = await parseStringAsync(response, {explicitArray: false});
|
let {user: res} = await parseStringAsync(response, {explicitArray: false});
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ module.exports = {
|
|||||||
target: DEV_BASE_URL,
|
target: DEV_BASE_URL,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
},
|
},
|
||||||
|
'/export': {
|
||||||
|
target: DEV_BASE_URL,
|
||||||
|
changeOrigin: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// CSS Sourcemaps off by default because relative paths are "buggy"
|
// CSS Sourcemaps off by default because relative paths are "buggy"
|
||||||
// with this option, according to the CSS-Loader README
|
// with this option, according to the CSS-Loader README
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ api.exportUserHistory = {
|
|||||||
|
|
||||||
// Convert user to json and attach tasks divided by type
|
// Convert user to json and attach tasks divided by type
|
||||||
// at user.tasks[`${taskType}s`] (user.tasks.{dailys/habits/...})
|
// at user.tasks[`${taskType}s`] (user.tasks.{dailys/habits/...})
|
||||||
async function _getUserDataForExport (user) {
|
async function _getUserDataForExport (user, xmlMode = false) {
|
||||||
let userData = user.toJSON();
|
let userData = user.toJSON();
|
||||||
userData.tasks = {};
|
userData.tasks = {};
|
||||||
|
|
||||||
@@ -98,6 +98,33 @@ async function _getUserDataForExport (user) {
|
|||||||
userData.tasks[`${taskType}s`] = tasksPerType;
|
userData.tasks[`${taskType}s`] = tasksPerType;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (xmlMode) {
|
||||||
|
// object maps cant be parsed
|
||||||
|
userData.inbox.messages = _(userData.inbox.messages)
|
||||||
|
.map(m => {
|
||||||
|
const flags = Object.keys(m.flags);
|
||||||
|
m.flags = flags;
|
||||||
|
|
||||||
|
return m;
|
||||||
|
})
|
||||||
|
.value();
|
||||||
|
|
||||||
|
// _id gets parsed as an bytearray => which gets casted to a chararray => "weird chars"
|
||||||
|
userData.unpinnedItems = userData.unpinnedItems.map(i => {
|
||||||
|
return {
|
||||||
|
path: i.path,
|
||||||
|
type: i.type,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
userData.pinnedItems = userData.pinnedItems.map(i => {
|
||||||
|
return {
|
||||||
|
path: i.path,
|
||||||
|
type: i.type,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return userData;
|
return userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +164,7 @@ api.exportUserDataXml = {
|
|||||||
url: '/export/userdata.xml',
|
url: '/export/userdata.xml',
|
||||||
middlewares: [authWithSession],
|
middlewares: [authWithSession],
|
||||||
async handler (req, res) {
|
async handler (req, res) {
|
||||||
let userData = await _getUserDataForExport(res.locals.user);
|
let userData = await _getUserDataForExport(res.locals.user, true);
|
||||||
|
|
||||||
res.set({
|
res.set({
|
||||||
'Content-Type': 'text/xml',
|
'Content-Type': 'text/xml',
|
||||||
|
|||||||
Reference in New Issue
Block a user