RobDWaller/fableau

View on GitHub
src/js/service/facebook/requests.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict'

import PageMeta from '../../mapper/page-meta.js'
import PostMeta from '../../mapper/post-meta.js'
import PageMetrics from '../../mapper/page-metrics.js'
import PostMetrics from '../../mapper/post-metrics.js'
import DateTime from '../../helper/date-time.js'

/**
 * Facade for the individual requests for Facebook posts and pages data.
 *
 * @author Rob Waller <rdwaller1984@googlemail.com>
 */
class FacebookRequests {
  /**
   * @todo probably sensible to inject the other parts into the contructor
   * @param Object facebookData
   */
  constructor (facebookData) {
    this.facebookData = facebookData

    this.urlPrepend = 'https://graph.facebook.com'

    this.date = new DateTime()
  }

  /**
   * Get a list of posts from the Facebook page
   *
   * @param Object page
   * @return Promise
   */
  getPosts (page) {
    return this.facebookData.getDataPaginate(`${this.urlPrepend}/${page.id}/posts?fields=created_time,message,id,link,type&access_token=${page.access_token}`)
      .then((result) => {
        return new PostMeta(result)
      })
  }

  /**
   * Get the metrics for the individual posts
   *
   * @param Object page
   * @return Promise
   */
  getPostMetrics (page) {
    return this.facebookData.getDataPaginate(
      `${this.urlPrepend}/${page.id}/posts?fields=insights.metric(post_impressions,post_impressions_unique,post_impressions_paid,post_impressions_paid_unique,post_reactions_like_total,post_reactions_love_total,post_reactions_wow_total,post_reactions_haha_total,post_reactions_sorry_total,post_reactions_anger_total)&access_token=${page.access_token}`
    ).then((result) => {
      return new PostMetrics(result)
    })
  }

  /**
   * Get details on an idividual Facebook page
   *
   * @param Object page
   * @return Promise
   */
  getPage (page) {
    return this.facebookData.getData(`${this.urlPrepend}/${page.id}/?fields=link,name,category,about&access_token=${page.access_token}`)
      .then((result) => {
        return new PageMeta([result])
      })
  }

  /**
   * Return a list of Facebook pages that the user has access to.
   *
   * @param string accessToken
   * @return Promise
   */
  getPages (accessToken) {
    return this.facebookData.getDataPaginate(`${this.urlPrepend}/me/accounts?access_token=${accessToken}`)
      .then((result) => {
        return new PageMeta(result)
      })
  }

  /**
   * Get the metrics for the Facebook page.
   *
   * @param Object page
   * @return Promise
   */
  getPageMetrics (page) {
    return this.facebookData.getDataPaginate(
      `${this.urlPrepend}/${page.id}/insights/page_impressions,page_impressions_unique,page_impressions_paid,page_impressions_organic,page_engaged_users,page_consumptions,page_consumptions_unique,page_negative_feedback,page_negative_feedback_unique,page_fan_adds_unique,page_views_total,page_views_logged_in_unique,page_posts_impressions,page_posts_impressions_unique,page_posts_impressions_paid,page_posts_impressions_organic,page_post_engagements,page_video_views?access_token=${page.access_token}&since=${this.date.getUnixTimestampMinusDays(90)}&until=${this.date.getUnixTimestamp()}`, 'previous', true
    ).then((result) => {
      return new PageMetrics(result)
    })
  }

  /**
   * @todo need to consider this.
   */
  getAccessTokenStatus (page) {
    return this.facebookData.getData(`${this.urlPrepend}/oauth/access_token_info?access_token=${page.access_token}`)
      .then((result) => {
        if (typeof (result.expires_in) === 'undefined') {
          return false
        }

        if (result.expires_in < 1) {
          return false
        }

        return true
      })
  }
}

export default FacebookRequests