'use strict'; const Promise = require('bluebird'); const getIndex = require('./getIndex.js'); const curateUser = require('../curate/user.js'); const logger = require('../logger')(__filename); const limiter = require('../limiter').reddit; async function getUser(username, reddit) { try { const user = await limiter.schedule(async () => reddit.getUser(username).fetch()); return curateUser(user); } catch (error) { logger.error(`Failed to fetch reddit user '${username}': ${error.message} (https://reddit.com/user/${username})`); return { name: username, fallback: true, }; } } const getPostsWrap = reddit => function getPosts(postIds, userPosts = {}) { return Promise.reduce(postIds, (accUserPosts, postId) => Promise.resolve().then(async () => { const post = await limiter.schedule(async () => reddit.getSubmission(postId).fetch()); post.direct = true; if (accUserPosts[post.author.name]) { return { ...accUserPosts, [post.author.name]: { ...accUserPosts[post.author.name], posts: [...accUserPosts[post.author.name].posts, post], }, }; } // don't attempt to fetch deleted user if (post.author.name === '[deleted]') { return { ...accUserPosts, '[deleted]': { name: '[deleted]', deleted: true, posts: [post], indexed: { profile: {}, original: [], updated: [], }, }, }; } const user = await getUser(post.author.name, reddit); const { profile, posts: indexed } = await getIndex(user); return { ...accUserPosts, [post.author.name]: { ...user, posts: [post], indexed: { profile, original: indexed, updated: [], }, }, }; }), userPosts); }; module.exports = getPostsWrap;