UNPKG

@atlaskit/profilecard

Version:

A React component to display a card with user information.

311 lines (307 loc) 13.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.buildReportingLinesQuery = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _platformFeatureFlags = require("@atlaskit/platform-feature-flags"); var _CachingClient2 = _interopRequireDefault(require("./CachingClient")); var _getOrgIdForCloudIdFromAGG = require("./getOrgIdForCloudIdFromAGG"); var _graphqlUtils = require("./graphqlUtils"); function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var UNSHARDED_PREFIX = '/gateway/api/watermelon'; var buildReportingLinesQuery = exports.buildReportingLinesQuery = function buildReportingLinesQuery(aaid) { return { query: "\n fragment ReportingLinesUserPII on UserPII {\n name\n picture\n }\n\n fragment ReportingLinesUserFragment on ReportingLinesUser {\n accountIdentifier\n identifierType\n pii {\n ...ReportingLinesUserPII\n }\n }\n\n query ReportingLines($aaid: String) {\n reportingLines(aaidOrHash: $aaid) {\n managers {\n ...ReportingLinesUserFragment\n }\n reports {\n ...ReportingLinesUserFragment\n }\n }\n }\n ", variables: { aaid: aaid } }; }; var orgContainsAnyWorkspacePromiseCache = new Map(); var orgIdPromiseCache = new Map(); var workspaceExistsWithTypePromiseCache = new Map(); var TeamCentralCardClient = /*#__PURE__*/function (_CachingClient) { /** * Simple circuit breaker to avoid making unnecessary calls to Team Central on auth failures * This is to handle the case where products may have provided teamCentralUrl, but the site itself * doesn't actually have any TC product. * * There's currently no way to reset this circuit breaker, but that's fine. This is meant to * catch a pretty specific edge case. */ function TeamCentralCardClient(options) { var _this; (0, _classCallCheck2.default)(this, TeamCentralCardClient); _this = _callSuper(this, TeamCentralCardClient, [options]); _this.options = options; _this.bypassOnFailure = false; _this.orgContainsAnyWorkspacePromise = _this.createOrgContainsAnyWorkspacePromise(options); _this.workspaceExistsWithTypePromise = _this.preloadWorkspaceExistsWithType(options.cloudId); _this.orgIdPromise = _this.preloadOrgId(options.gatewayGraphqlUrl, options.cloudId, options.orgId); return _this; } (0, _inherits2.default)(TeamCentralCardClient, _CachingClient); return (0, _createClass2.default)(TeamCentralCardClient, [{ key: "createOrgContainsAnyWorkspacePromise", value: function createOrgContainsAnyWorkspacePromise(config) { if (config.cloudId) { var promise = orgContainsAnyWorkspacePromiseCache.get(config.cloudId); if (!promise) { promise = this.getOrgContainsAnyWorkspace(config.cloudId); orgContainsAnyWorkspacePromiseCache.set(config.cloudId, promise); } return promise; } return Promise.resolve(true); } }, { key: "getReportingLines", value: function getReportingLines(userId) { var _this2 = this; return this.orgContainsAnyWorkspacePromise.then(function (orgContainsAnyWorkspace) { if (orgContainsAnyWorkspace) { if (!userId) { return Promise.reject(new Error('userId missing')); } var cache = _this2.getCachedProfile(userId); if (cache) { return Promise.resolve(cache); } if (_this2.bypassOnFailure) { return Promise.resolve({}); } return new Promise(function (resolve) { _this2.makeRequest(userId).then(function (data) { var enhancedData = { managers: _this2.filterReportingLinesUser(data === null || data === void 0 ? void 0 : data.managers), reports: _this2.filterReportingLinesUser(data === null || data === void 0 ? void 0 : data.reports) }; if (_this2.cache) { _this2.setCachedProfile(userId, enhancedData); } resolve(enhancedData); }).catch(function (error) { if ((error === null || error === void 0 ? void 0 : error.status) === 401 || (error === null || error === void 0 ? void 0 : error.status) === 403) { // Trigger circuit breaker _this2.bypassOnFailure = true; } /** * Reporting lines aren't part of the critical path of profile card. * Just resolve with empty values instead of bubbling up the error. */ resolve({}); }); }); } return Promise.resolve({ managers: [], reports: [] }); }, function () { return Promise.resolve({ managers: [], reports: [] }); }); } /** * `public` so that mock client can override it; do not use it otherwise! */ }, { key: "makeRequest", value: (function () { var _makeRequest = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(userId) { var query, response; return _regenerator.default.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (!(this.options.teamCentralDisabled === true)) { _context.next = 2; break; } throw new Error('makeRequest cannot be called when the client has been disabled'); case 2: query = buildReportingLinesQuery(userId); _context.next = 5; return (0, _graphqlUtils.directoryGraphqlQuery)('/gateway/api/watermelon/graphql?operationName=ReportingLines', query); case 5: response = _context.sent; return _context.abrupt("return", response.reportingLines); case 7: case "end": return _context.stop(); } }, _callee, this); })); function makeRequest(_x) { return _makeRequest.apply(this, arguments); } return makeRequest; }()) }, { key: "checkWorkspaceExists", value: function () { var _checkWorkspaceExists = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() { var workspaceExistsPromise; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: workspaceExistsPromise = (0, _platformFeatureFlags.fg)('enable_ptc_townsquare_reporting_lines_unsharded') ? this.workspaceExistsWithTypePromise.then(function (workspaceExistsWithType) { return workspaceExistsWithType !== undefined; }) : this.orgContainsAnyWorkspacePromise; return _context2.abrupt("return", workspaceExistsPromise.then(function (workspaceExistsWithType) { if (workspaceExistsWithType) { return Promise.resolve(true); } return Promise.resolve(false); }, function () { return Promise.resolve(false); })); case 2: case "end": return _context2.stop(); } }, _callee2, this); })); function checkWorkspaceExists() { return _checkWorkspaceExists.apply(this, arguments); } return checkWorkspaceExists; }() }, { key: "getIsGlobalExperienceWorkspace", value: function () { var _getIsGlobalExperienceWorkspace = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() { return _regenerator.default.wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this.workspaceExistsWithTypePromise; case 2: _context3.t0 = _context3.sent; return _context3.abrupt("return", _context3.t0 === 'GLOBAL_EXPERIENCE'); case 4: case "end": return _context3.stop(); } }, _callee3, this); })); function getIsGlobalExperienceWorkspace() { return _getIsGlobalExperienceWorkspace.apply(this, arguments); } return getIsGlobalExperienceWorkspace; }() }, { key: "getOrgId", value: function getOrgId() { return this.orgIdPromise; } }, { key: "preloadWorkspaceExistsWithType", value: function preloadWorkspaceExistsWithType(cloudId) { if (cloudId === undefined) { return Promise.resolve(undefined); } var maybeWorkspaceExistsWithTypePromise = workspaceExistsWithTypePromiseCache.get(cloudId); if (maybeWorkspaceExistsWithTypePromise !== undefined) { return maybeWorkspaceExistsWithTypePromise; } var workspaceExistsWithTypePromise = this.getWorkspaceExistsWithType(cloudId); workspaceExistsWithTypePromiseCache.set(cloudId, workspaceExistsWithTypePromise); return workspaceExistsWithTypePromise; } }, { key: "getOrgContainsAnyWorkspace", value: function getOrgContainsAnyWorkspace(cloudId) { if (cloudId) { return fetch(((0, _platformFeatureFlags.fg)('enable_ptc_townsquare_reporting_lines_unsharded') ? UNSHARDED_PREFIX : this.getShardedApiPath(cloudId)) + "/organization/containsAnyWorkspace?cloudId=".concat(cloudId)).then(function (res) { return !res || res && res.ok; }); } else { return Promise.resolve(false); } } }, { key: "getWorkspaceExistsWithType", value: function () { var _getWorkspaceExistsWithType = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(cloudId) { var response, workspaceType; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.prev = 0; _context4.next = 3; return fetch("".concat(this.getShardedApiPath(cloudId), "/workspace/existsWithWorkspaceType?cloudId=").concat(cloudId), { credentials: 'include' }); case 3: response = _context4.sent; if (!response.ok) { _context4.next = 9; break; } _context4.next = 7; return response.text(); case 7: workspaceType = _context4.sent; return _context4.abrupt("return", Promise.resolve(workspaceType)); case 9: _context4.next = 14; break; case 11: _context4.prev = 11; _context4.t0 = _context4["catch"](0); return _context4.abrupt("return", Promise.resolve(undefined)); case 14: case "end": return _context4.stop(); } }, _callee4, this, [[0, 11]]); })); function getWorkspaceExistsWithType(_x2) { return _getWorkspaceExistsWithType.apply(this, arguments); } return getWorkspaceExistsWithType; }() }, { key: "preloadOrgId", value: function preloadOrgId(gatewayGraphqlUrl, cloudId, orgId) { if (cloudId === undefined) { return Promise.resolve(null); } if (orgId !== undefined) { return Promise.resolve(orgId); } var maybeOrgIdForCloudIdPromise = orgIdPromiseCache.get(cloudId); if (maybeOrgIdForCloudIdPromise !== undefined) { return maybeOrgIdForCloudIdPromise; } var orgIdForCloudIdPromise = (0, _getOrgIdForCloudIdFromAGG.getOrgIdForCloudIdFromAGG)(gatewayGraphqlUrl, cloudId); orgIdPromiseCache.set(cloudId, orgIdForCloudIdPromise); return orgIdForCloudIdPromise; } }, { key: "getShardedApiPath", value: function getShardedApiPath(cloudId) { return "/gateway/api/townsquare/s/".concat(cloudId); } }, { key: "filterReportingLinesUser", value: function filterReportingLinesUser() { var users = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return users.filter(function (user) { return user.identifierType === 'ATLASSIAN_ID'; }); } }]); }(_CachingClient2.default); var _default = exports.default = TeamCentralCardClient;