models/SearchResults.js

const axios = require('axios')
const User = require('./User')
const UserForMember = require('./UserForMember')
const EntryCollection = require('./EntryCollection')
const { URLS } = require('../constants')

/**
 * Search results.
 */
class SearchResults {
  /**
   * Search text.
   *
   * @type {string}
   */
  searchText

  /**
   * Users.
   *
   * @type {Array<(User|UserForMember)>}
   */
  users = []

  /**
   * Titles.
   *
   * @type {Array<EntryCollection>}
   */
  titles = []

  /**
   * Create search results.
   *
   * @param {object}  request         Axios client.
   * @param {string}  text            Search text.
   * @param {string}  [cookies=null]  Cookie string.
   */
  constructor (request, text, cookies = null) {
    this.searchText = text
    this._request = request
    this._cookies = cookies
  }

  /**
   * Retrieve search results.
   *
   * @returns {Promise} Promise.
   */
  retrieve () {
    return new Promise((resolve, reject) => {
      axios({
        url: URLS.SEARCH,
        method: 'GET',
        headers: {
          'x-requested-with': 'XMLHttpRequest'
        },
        params: {
          q: this.searchText
        }
      }).then(res => {
        // handle users
        res.data.Nicks.forEach(username => {
          const user = this._cookies
            ? new UserForMember(this._request, username, this._cookies)
            : new User(this._request, username)
          this.users.push(user)
        })

        // handle titles
        res.data.Titles.forEach(titleName => {
          const title = new EntryCollection(this._request, titleName, {
            cookies: this._cookies
          })
          this.titles.push(title)
        })

        resolve()
      })
    })
  }
}

module.exports = SearchResults