Favor FlowRouter.url over Meteor.absoluteUrl

It hides the leading slash treatment as an hidden implementation
detail.
This commit is contained in:
Maxime Quandalle 2016-01-05 13:37:15 +01:00
parent 9ef8ebaf09
commit 701262a439
3 changed files with 17 additions and 34 deletions

View file

@ -19,7 +19,7 @@ Template.boardMenuPopup.helpers({
exportUrl() {
const boardId = Session.get('currentBoard');
const loginToken = Accounts._storedLoginToken();
return Meteor.absoluteUrl(`api/boards/${boardId}?authToken=${loginToken}`);
return FlowRouter.url(`api/boards/${boardId}?authToken=${loginToken}`);
},
exportFilename() {
const boardId = Session.get('currentBoard');

View file

@ -2,8 +2,10 @@
if(Meteor.isServer) {
// todo XXX once we have a real API in place, move that route there
// todo XXX also share the route definition between the client and the server
// so that we could use something like ApiRoutes.path('boards/export', boardId)
// on the client instead of copy/pasting the route path manually between the client and the server.
// so that we could use something like
// `ApiRoutes.path('boards/export', boardId)``
// on the client instead of copy/pasting the route path manually between the
// client and the server.
/*
* This route is used to export the board FROM THE APPLICATION.
* If user is already logged-in, pass loginToken as param "authToken":
@ -29,8 +31,8 @@ if(Meteor.isServer) {
if(exporter.canExport(user)) {
JsonRoutes.sendResult(res, 200, exporter.build());
} else {
// we could send an explicit error message, but on the other hand the only way to
// get there is by hacking the UI so let's keep it raw.
// we could send an explicit error message, but on the other hand the only
// way to get there is by hacking the UI so let's keep it raw.
JsonRoutes.sendResult(res, 403);
}
});
@ -54,14 +56,16 @@ class Exporter {
result.comments = CardComments.find(byBoard, noBoardId).fetch();
result.activities = Activities.find(byBoard, noBoardId).fetch();
// for attachments we only export IDs and absolute url to original doc
result.attachments = Attachments.find(byBoard).fetch().map((attachment) => { return {
_id: attachment._id,
cardId: attachment.cardId,
url: Meteor.absoluteUrl(Utils.stripLeadingSlash(attachment.url())),
};});
result.attachments = Attachments.find(byBoard).fetch().map((attachment) => {
return {
_id: attachment._id,
cardId: attachment.cardId,
url: FlowRouter.url(attachment.url()),
};
});
// we also have to export some user data - as the other elements only include id
// but we have to be careful:
// we also have to export some user data - as the other elements only
// include id but we have to be careful:
// 1- only exports users that are linked somehow to that board
// 2- do not export any sensitive information
const users = {};
@ -88,7 +92,7 @@ class Exporter {
result.users = Users.find(byUserIds, userFields).fetch().map((user) => {
// user avatar is stored as a relative url, we export absolute
if(user.profile.avatarUrl) {
user.profile.avatarUrl = Meteor.absoluteUrl(Utils.stripLeadingSlash(user.profile.avatarUrl));
user.profile.avatarUrl = FlowRouter.url(user.profile.avatarUrl);
}
return user;
});

View file

@ -5,24 +5,3 @@ allowIsBoardAdmin = function(userId, board) {
allowIsBoardMember = function(userId, board) {
return board && board.hasMember(userId);
};
// todo XXX not really server-specific,
// so move it to a common (client+server) lib?
Utils = {
/**
* If text starts with a / will remove it.
* @param text
*/
stripLeadingSlash(text) {
// we need an actual text string
if (!text) {
return text;
}
// if starting with slash
if (text[0] === '/') {
return text.slice(1);
}
// otherwise leave untouched
return text;
},
};