UNPKG

dcard

Version:

👫 Unofficial Dcard API wrapper for Node.js developers.

282 lines (241 loc) • 8.96 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.setReadPercentage = exports.listTrendingPost = exports.searchPost = exports.reportPost = exports.unsubscribePost = exports.subscribePost = exports.uncollectPost = exports.collectPost = exports.unlikePost = exports.likePost = exports.destroyPost = exports.updatePost = exports.createPost = exports.getPost = exports.listMySubscription = exports.listMyPost = exports.listPost = undefined; var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var getCollection = function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { var collections; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _collections.listCollection)(); case 2: collections = _context.sent; return _context.abrupt('return', collections[0]); case 4: case 'end': return _context.stop(); } } }, _callee, this); })); return function getCollection() { return _ref.apply(this, arguments); }; }(); var collectPost = exports.collectPost = function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(id) { var collection; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return getCollection(); case 2: collection = _context2.sent; return _context2.abrupt('return', (0, _request.api)('collections/' + collection.get('id') + '/posts', { method: 'post', body: { postId: +id } }).then(_request.filterError)); case 4: case 'end': return _context2.stop(); } } }, _callee2, this); })); return function collectPost(_x) { return _ref2.apply(this, arguments); }; }(); var uncollectPost = exports.uncollectPost = function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(id) { var collection; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: collection = getCollection(); return _context3.abrupt('return', (0, _request.api)('collections/' + collection.get('id') + '/posts/' + id, { method: 'delete' }).then(_request.filterError)); case 2: case 'end': return _context3.stop(); } } }, _callee3, this); })); return function uncollectPost(_x2) { return _ref3.apply(this, arguments); }; }(); var _lodash = require('lodash'); var _qs = require('qs'); var _qs2 = _interopRequireDefault(_qs); var _request = require('../request'); var _collections = require('./collections'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * List Posts of a forum * @param {object} options * @param {String} options.forum vehicle for instance, please refer to docs/forumList.json to get forum name. * @param {String} options.before List posts before a post id * @param {String} options.after List posts after a post id * @param {Boolean} options.popular true | false * @example * const options = { * forum: 'vehicle', * popular: false, * before: 225687456, * }; * listPost(options).then((res) => { * console.log(res); * }); */ var listPost = exports.listPost = function listPost(options) { var url = options.forum ? 'forums/' + options.forum + '/posts' : 'posts'; return (0, _request.api)(url + '?' + _qs2.default.stringify((0, _lodash.omit)(options, 'forum'))).then(_request.filterError).then(_request.parseJSON).then(function (res) { // event article if (!options.popular || options.after || options.before) { return res; } var angels = []; return res.reduce(function (posts, post, idx) { var p = posts.slice(); if (idx === 9 && angels.length) { p = p.concat(angels); angels = []; } else if (post.pinned && post.department === 'dcardadangel') { angels.push(post); } else { p.push(post); } return p; }, []).concat(angels); }); }; /** * List your posts. login required. * @param {object} options * @param {String} options.before List posts before a post id * @example * const options = { * before: 225687456, * }; * listMyPost(options).then((res) => { * console.log(res); * }); */ var listMyPost = exports.listMyPost = function listMyPost(options) { return (0, _request.api)('me/posts?' + _qs2.default.stringify(options)).then(_request.filterError).then(_request.parseJSON); }; /** * List your subscriptions. login required. * @param {object} options * @param {Boolean} options.popular true | false * @example * const options = { * popular: true, * }; * listMySubscription(options).then((res) => { * console.log(res); * }); */ var listMySubscription = exports.listMySubscription = function listMySubscription(options) { return (0, _request.api)('me/subscriptions?' + _qs2.default.stringify(options)).then(_request.filterError).then(_request.parseJSON); }; /** * Get content of a specified post id. * @param {object} options {} is allowed * @param {Number} id post id * @example * const postId = 225688036; * const options = {}; * getPost(postId, options).then((res) => { * console.log(res); * }); */ var getPost = exports.getPost = function getPost(id, options) { return (0, _request.api)('posts/' + id + '?' + _qs2.default.stringify(options)).then(_request.filterError).then(_request.parseJSON); }; var createPost = exports.createPost = function createPost(data) { return (0, _request.api)(data.replyId ? 'posts/' + data.replyId + '/replies' : 'forums/' + data.forum + '/posts', { method: 'post', body: (0, _lodash.pick)(data, ['title', 'content', 'anonymous', 'withNickname']) }).then(_request.filterError).then(_request.parseJSON); }; var updatePost = exports.updatePost = function updatePost(id, data) { return (0, _request.api)('posts/' + id, { method: 'put', body: (0, _lodash.pick)(data, ['title', 'content']) }).then(_request.filterError).then(_request.parseJSON); }; var destroyPost = exports.destroyPost = function destroyPost(id) { return (0, _request.api)('posts/' + id, { method: 'delete' }).then(_request.filterError).then(function () { return { id: +id }; }); }; var likePost = exports.likePost = function likePost(id) { return (0, _request.api)('posts/' + id + '/like', { method: 'post' }).then(_request.filterError); }; var unlikePost = exports.unlikePost = function unlikePost(id) { return (0, _request.api)('posts/' + id + '/like', { method: 'delete' }).then(_request.filterError); }; var subscribePost = exports.subscribePost = function subscribePost(id) { return (0, _request.api)('posts/' + id + '/subscribe', { method: 'post' }).then(_request.filterError); }; var unsubscribePost = exports.unsubscribePost = function unsubscribePost(id) { return (0, _request.api)('posts/' + id + '/subscribe', { method: 'delete' }).then(_request.filterError); }; var reportPost = exports.reportPost = function reportPost(id, data) { return (0, _request.api)('posts/' + id + '/reports', { method: 'post', body: data }).then(_request.filterError).then(_request.parseJSON).catch(function (res) { return res.response.status === 403; }); }; /** * Search posts by specified keyword. * @param {object} options * @param {string} options.query search keyword * @example * const options = { * query: '愛情', * }; * searchPost(options).then((res) => { * console.log(res); * }); */ var searchPost = exports.searchPost = function searchPost(options) { return (0, _request.api)('search/posts?' + _qs2.default.stringify(options)).then(_request.filterError).then(_request.parseJSON); }; var listTrendingPost = exports.listTrendingPost = function listTrendingPost(options) { return (0, _request.api)('topix/' + options.tags + '/posts?' + _qs2.default.stringify((0, _lodash.omit)(options, 'tags'))).then(_request.filterError).then(_request.parseJSON); }; var setReadPercentage = exports.setReadPercentage = function setReadPercentage(id) { return (0, _request.api)('posts/' + id + '/readPercentage/100', { method: 'post' }).then(_request.filterError); };