UNPKG

twreporter-react

Version:

React-Redux site for The Reporter Foundation in Taiwan

427 lines (350 loc) 14.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchArticlesByIdsIfNeeded = fetchArticlesByIdsIfNeeded; exports.fetchArticlesByTopicIdIfNeeded = fetchArticlesByTopicIdIfNeeded; exports.fetchArticlesByTagIdIfNeeded = fetchArticlesByTagIdIfNeeded; exports.fetchArticlesByCatIdIfNeeded = fetchArticlesByCatIdIfNeeded; exports.fetchArticlesByTopicIdNameIfNeeded = fetchArticlesByTopicIdNameIfNeeded; exports.fetchArticlesByCatNameIfNeeded = fetchArticlesByCatNameIfNeeded; exports.fetchArticlesByTagNameIfNeeded = fetchArticlesByTagNameIfNeeded; var _customError = require('../lib/custom-error'); var _normalizr = require('normalizr'); var _index = require('../schemas/index'); var _humps = require('humps'); var _listId = require('../conf/list-id'); var _index2 = require('../utils/index'); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _actionTypes = require('../constants/action-types'); var types = _interopRequireWildcard(_actionTypes); var _isomorphicFetch = require('isomorphic-fetch'); var _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch); var _qs = require('qs'); var _qs2 = _interopRequireDefault(_qs); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function requestArticlesByTagId(ids) { return { type: types.FETCH_ARTICLES_BY_TAG_ID_REQUEST, id: _lodash2.default.get(ids, 0) }; } function failToReceiveArticlesByTagId(ids, error) { return { type: types.FETCH_ARTICLES_BY_TAG_ID_FAILURE, id: _lodash2.default.get(ids, 0), error: error, failedAt: Date.now() }; } function receiveArticlesByTagId(response, ids) { return { type: types.FETCH_ARTICLES_BY_TAG_ID_SUCCESS, id: _lodash2.default.get(ids, 0), response: response, receivedAt: Date.now() }; } function requestArticlesByCatId(ids) { return { type: types.FETCH_ARTICLES_BY_CAT_ID_REQUEST, id: _lodash2.default.get(ids, 0) }; } function failToReceiveArticlesByCatId(ids, error) { return { type: types.FETCH_ARTICLES_BY_CAT_ID_FAILURE, id: _lodash2.default.get(ids, 0), error: error, failedAt: Date.now() }; } function receiveArticlesByCatId(response, ids) { return { type: types.FETCH_ARTICLES_BY_CAT_ID_SUCCESS, id: _lodash2.default.get(ids, 0), response: response, receivedAt: Date.now() }; } function requestArticlesByTopicId(ids) { return { type: types.FETCH_ARTICLES_BY_TOPIC_ID_REQUEST, id: _lodash2.default.get(ids, 0) }; } function failToReceiveArticlesByTopicId(ids, error) { return { type: types.FETCH_ARTICLES_BY_TOPIC_ID_FAILURE, id: _lodash2.default.get(ids, 0), error: error, failedAt: Date.now() }; } function receiveArticlesByTopicId(response, ids) { return { type: types.FETCH_ARTICLES_BY_TOPIC_ID_SUCCESS, id: _lodash2.default.get(ids, 0), response: response, receivedAt: Date.now() }; } function requestArticlesByIds(ids) { return { type: types.FETCH_ARTICLES_REQUEST, ids: ids }; } function failToReceiveArticlesByIds(ids, error) { return { type: types.FETCH_ARTICLES_FAILURE, ids: ids, error: error, failedAt: Date.now() }; } function receiveArticlesByIds(response, ids) { return { type: types.FETCH_ARTICLES_SUCCESS, ids: ids, response: response, receivedAt: Date.now() }; } function _buildQuery() { var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var query = {}; var whitelist = ['where', 'embedded', 'max_results', 'page', 'sort']; _lodash2.default.forEach(whitelist, function (ele) { if (params.hasOwnProperty(ele)) { if (ele === 'where' || ele === 'embedded') { query[ele] = JSON.stringify(params[ele]); } else { query[ele] = params[ele]; } } }); query = _qs2.default.stringify(query); return query; } function _buildPostQueryUrl() { var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var query = _buildQuery(params); return (0, _index2.formatUrl)('posts?' + query); } function _buildMetaQueryUrl() { var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var query = _buildQuery(params); return (0, _index2.formatUrl)('meta?' + query); } function _buildUrl() { var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var target = arguments[1]; params = params || {}; params.sort = params.sort || '-publishedDate'; if (target === 'meta') { return _buildMetaQueryUrl(params); } return _buildPostQueryUrl(params); } function _setupWhereParam(key, value) { var params = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; params = params || {}; value = Array.isArray(value) ? value : [value]; var where = {}; if (value.length > 0) { _lodash2.default.merge(where, params.where, _defineProperty({}, key, { '$in': value })); } params.where = where; return params; } function _fetchArticles(url) { return (0, _isomorphicFetch2.default)(url).then(function (response) { var status = response.status; if (status === 404) { throw new _customError.NotFoundError('Resource are not found by url: ', url); } else if (status >= 400) { throw new _customError.InternalServerError('Bad response from API, response: ' + JSON.stringify(response)); } return response.json(); }); } function _fetchArticlesAndDispatchActions() { var ids = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; var requestAction = arguments[3]; var successAction = arguments[4]; var failAction = arguments[5]; return function (dispatch) { dispatch(requestAction(ids)); return _fetchArticles(_buildUrl(params, isOnlyMeta ? 'meta' : 'article')).then(function (response) { var camelizedJson = (0, _humps.camelizeKeys)(response); var normalized = (0, _normalizr.normalize)(camelizedJson.items, (0, _normalizr.arrayOf)(_index.article)); _lodash2.default.merge(normalized, { links: camelizedJson.links, meta: camelizedJson.meta }); return dispatch(successAction(normalized, ids)); }, function (error) { return dispatch(failAction(ids, error)); }); }; } function _dedupArticleIds() { var ids = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; var state = arguments[1]; var isOnlyMeta = arguments[2]; var articles = _lodash2.default.get(state, ['entities', 'articles'], {}); var idsToFetch = []; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = ids[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var id = _step.value; if (isOnlyMeta) { if (!articles.hasOwnProperty(id)) { idsToFetch.push(id); } } else { // use content of article to determine if the article is fully fetched or not if (!_lodash2.default.get(articles, [id, 'content'])) { idsToFetch.push(id); } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return idsToFetch; } function _getListId() { var target = arguments.length <= 0 || arguments[0] === undefined ? 'category' : arguments[0]; if (__DEVELOPMENT__) { // eslint-disable-line return target === 'category' ? _listId.devCatListId : _listId.devTopicListId; } return target === 'category' ? _listId.prodCatListId : _listId.prodTopicListId; } /* Fetch meta of articles by their ids if those are not existed in the state * properties of meta: subtitle, name, heroImage, title, topics, publishedDate, slug, links, created and id * @param {string[]} ids - article ids to fetch * @param {object} params - params for composing query param of api * @param {string} [params.sort=-publishedDate] -the way returned articles are sorted by * @param {object} params.where - where query param * @param {object} params.embedded - embedded query param * @param {boolean} isOnlyMeta - if true, only get metadata of articles. Otherwise, get full articles. */ function fetchArticlesByIdsIfNeeded() { var ids = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; return function (dispatch, getState) { var idsToFetch = _dedupArticleIds(ids, getState(), isOnlyMeta); if (idsToFetch.length === 0) { return Promise.resolve(); } params = _setupWhereParam('_id', idsToFetch, params); if (!isOnlyMeta) { // add default embedded params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)(); } return dispatch(_fetchArticlesAndDispatchActions(idsToFetch, params, isOnlyMeta, requestArticlesByIds, receiveArticlesByIds, failToReceiveArticlesByIds)); }; } function fetchArticlesByTopicIdIfNeeded() { var topicId = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; return function (dispatch, getState) { if (!topicId || _lodash2.default.get(getState(), ['articlesByTopics', topicId])) { return Promise.resolve(); } params = _setupWhereParam('topics', [topicId], params); if (!isOnlyMeta) { // add default embedded params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)(); } return dispatch(_fetchArticlesAndDispatchActions([topicId], params, isOnlyMeta, requestArticlesByTopicId, receiveArticlesByTopicId, failToReceiveArticlesByTopicId)); }; } function fetchArticlesByTagIdIfNeeded() { var tagId = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; return function (dispatch, getState) { var items = _lodash2.default.get(getState(), ['articleByTags', tagId, 'items'], []); if (!tagId || items.length >= params.max_results * params.page) { return Promise.resolve(); } params = _setupWhereParam('tags', [tagId], params); if (!isOnlyMeta) { // add default embedded params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)(); } return dispatch(_fetchArticlesAndDispatchActions([tagId], params, isOnlyMeta, requestArticlesByTagId, receiveArticlesByTagId, failToReceiveArticlesByTagId)); }; } function fetchArticlesByCatIdIfNeeded() { var catId = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; return function (dispatch, getState) { var items = _lodash2.default.get(getState(), ['articleByCats', catId, 'items'], []); if (!catId || items.length >= params.max_results * params.page) { return Promise.resolve(); } params = _setupWhereParam('categories', [catId], params); if (!isOnlyMeta) { // add default embedded params.embedded = params.embedded ? params.embedded : (0, _index2.getArticleEmbeddedQuery)(); } return dispatch(_fetchArticlesAndDispatchActions([catId], params, isOnlyMeta, requestArticlesByCatId, receiveArticlesByCatId, failToReceiveArticlesByCatId)); }; } function fetchArticlesByTopicIdNameIfNeeded() { var topicName = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; var listId = _getListId('topic'); var topicId = listId[topicName]; return fetchArticlesByTopicIdIfNeeded(topicId, params, isOnlyMeta); } function _fetchArticlesByName() { var name = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; var target = arguments[3]; var listId = _getListId(target); var id = listId[name]; params = params || {}; params.max_results = params.max_results || 10; params.page = params.page || 1; return target === 'category' ? fetchArticlesByCatIdIfNeeded(id, params, isOnlyMeta) : fetchArticlesByTagIdIfNeeded(id, params, isOnlyMeta); } function fetchArticlesByCatNameIfNeeded() { var catName = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; return _fetchArticlesByName(catName, params, isOnlyMeta, 'category'); } function fetchArticlesByTagNameIfNeeded() { var tagName = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0]; var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var isOnlyMeta = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; return _fetchArticlesByName(tagName, params, isOnlyMeta, 'tag'); }