'use strict'; const Promise = require('bluebird'); const getIndex = require('./getIndex.js'); const curateUser = require('../curate/user.js'); const getUser = async (username, reddit) => { try { const user = await reddit.getUser(username).fetch(); return curateUser(user); } catch (error) { console.log('\x1b[31m%s\x1b[0m', `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 reddit.getSubmission(postId).fetch(); post.direct = true; if (accUserPosts[post.author.name]) { accUserPosts[post.author.name].posts = accUserPosts[post.author.name].posts.concat(post); return accUserPosts; } // don't attempt to fetch deleted user if (post.author.name === '[deleted]') { return { ...accUserPosts, '[deleted]': { name: '[deleted]', deleted: true, posts: [post] } }; } 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;