@state-less/leap-backend
Version:
A collection of open source fullstack services
132 lines (131 loc) • 6.65 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Comments = exports.CommentPolicies = exports.Comment = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _reactServer = require("@state-less/react-server");
var _uuid = require("uuid");
var _config = require("../lib/config");
var _ServerSideProps = require("./ServerSideProps");
var _Votings = require("./Votings");
var _jsxRuntime = require("@state-less/react-server/dist/jsxRenderer/jsx-runtime");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* eslint-disable no-shadow */ /* eslint-disable no-unused-vars */
var CommentPolicies = exports.CommentPolicies = /*#__PURE__*/function (CommentPolicies) {
CommentPolicies[CommentPolicies["Authenticate"] = 0] = "Authenticate";
CommentPolicies[CommentPolicies["AuthenticateRead"] = 1] = "AuthenticateRead";
CommentPolicies[CommentPolicies["Delete"] = 2] = "Delete";
return CommentPolicies;
}({});
var Comments = exports.Comments = function Comments(_ref, _ref2) {
var _user5, _user6, _user7;
var _ref$policies = _ref.policies,
policies = _ref$policies === void 0 ? [] : _ref$policies,
_ref$users = _ref.users,
users = _ref$users === void 0 ? [] : _ref$users;
var key = _ref2.key,
context = _ref2.context;
if ((0, _reactServer.isClientContext)(context) && policies.includes(CommentPolicies.AuthenticateRead)) (0, _reactServer.authenticate)(context.headers, _config.JWT_SECRET);
var user;
try {
user = (0, _reactServer.authenticate)(context.headers, _config.JWT_SECRET);
} catch (e) {
user = null;
}
var _useState = (0, _reactServer.useState)([], {
key: "comments",
scope: key
}),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
comments = _useState2[0],
setComments = _useState2[1];
var comment = function comment(message) {
var _decoded;
var decoded = null;
try {
decoded = (0, _reactServer.authenticate)(context.headers, _config.JWT_SECRET);
} catch (e) {
decoded = null;
}
if (policies.includes(CommentPolicies.Authenticate)) {
if (!decoded) {
throw new Error('Not authenticated');
}
}
if (!message) throw new Error('Message is required');
var _ref3 = decoded || {
strategy: 'anonymous'
},
strategy = _ref3.strategy;
var _ref4 = ((_decoded = decoded) === null || _decoded === void 0 || (_decoded = _decoded.strategies) === null || _decoded === void 0 ? void 0 : _decoded[strategy]) || {
email: null,
decoded: {
name: 'Anonymous',
picture: null
}
},
email = _ref4.email,
_ref4$decoded = _ref4.decoded,
name = _ref4$decoded.name,
picture = _ref4$decoded.picture;
var commentObj = {
id: (0, _uuid.v4)(),
message: message,
identity: {
id: context.headers['x-unique-id'],
email: email,
strategy: strategy,
name: name,
picture: picture
}
};
var newComments = [].concat((0, _toConsumableArray2["default"])(comments), [commentObj]);
setComments(newComments);
};
var del = function del(index) {
var _user, _user2, _user3, _user4;
var commentToDelete = comments[index];
if (!commentToDelete) throw new Error('Comment not found');
var isOwnComment = commentToDelete.identity.email === ((_user = user) === null || _user === void 0 || (_user = _user.strategies) === null || _user === void 0 || (_user = _user[(_user2 = user) === null || _user2 === void 0 ? void 0 : _user2.strategy]) === null || _user === void 0 ? void 0 : _user.email) || commentToDelete.identity.id === context.headers['x-unique-id'] && commentToDelete.identity.strategy === 'anonymous';
if (!isOwnComment && !users.includes((_user3 = user) === null || _user3 === void 0 || (_user3 = _user3.strategies) === null || _user3 === void 0 || (_user3 = _user3[(_user4 = user) === null || _user4 === void 0 ? void 0 : _user4.strategy]) === null || _user3 === void 0 ? void 0 : _user3.email)) {
throw new Error('Not an admin');
}
var newComments = (0, _toConsumableArray2["default"])(comments);
newComments.splice(index, 1);
setComments(newComments);
};
return (0, _jsxRuntime.jsx)(_ServerSideProps.ServerSideProps, {
permissions: {
comment: policies.includes(CommentPolicies.Authenticate) ? !!((_user5 = user) !== null && _user5 !== void 0 && _user5.id) : true,
"delete": users.includes((_user6 = user) === null || _user6 === void 0 || (_user6 = _user6.strategies) === null || _user6 === void 0 || (_user6 = _user6[(_user7 = user) === null || _user7 === void 0 ? void 0 : _user7.strategy]) === null || _user6 === void 0 ? void 0 : _user6.email)
},
comments: comments,
comment: comment,
del: del,
children: comments.map(function (cmt, i) {
return (0, _jsxRuntime.jsx)(Comment, _objectSpread(_objectSpread({}, cmt), {}, {
remove: function remove() {
return del(i);
}
}), "comment-".concat(cmt.id));
})
}, (0, _reactServer.clientKey)("".concat(key, "-props"), context));
};
var Comment = exports.Comment = function Comment(props, _ref5) {
var key = _ref5.key;
var remove = props.remove;
var del = function del() {
_reactServer.Dispatcher.getCurrent().destroy();
remove();
};
return (0, _jsxRuntime.jsx)(_ServerSideProps.ServerSideProps, _objectSpread(_objectSpread({}, props), {}, {
del: del,
children: (0, _jsxRuntime.jsx)(_Votings.Votings, {
policies: [_Votings.VotingPolicies.SingleVote]
}, "votings-".concat(key))
}), "".concat(key, "-props"));
};