models/FollowedUserFavoriteEntry.js

const { URLS } = require('../constants')
const UserForMember = require('./UserForMember')
const EntryForMember = require('./EntryForMember')

/**
 * Followed user favorite entry.
 */
class FollowedUserFavoriteEntry {
  /**
   * Entry ID.
   *
   * @type {number}
   */
  entryId

  /**
   * Title name.
   *
   * @type {string}
   */
  titleName

  /**
   * Entry URL.
   *
   * @type {string}
   */
  entryUrl

  /**
   * Title slug.
   *
   * @type {string}
   */
  titleSlug

  /**
   * Entry owner.
   *
   * @type {UserForMember}
   */
  owner

  /**
   * Entry itself.
   *
   * @type {EntryForMember}
   */
  entry

  /**
   * Create title.
   *
   * @param {object}  request Axios client.
   * @param {string}  cookies Cookie string.
   */
  constructor (request, cookies) {
    this._request = request
    this._cookies = cookies
  }

  /**
   * Parse properties with given document.
   *
   * @param {object}  $    Cheerio document.
   * @param {object}  elm  Cheerio element.
   * @ignore
   */
  serialize ($, elm) {
    const titleName = $(elm)
      .text()
      .trim()
    const owner = $(elm)
      .find('a div')
      .text()
      .trim()
    const entryId = parseInt(
      $(elm)
        .find('a')
        .attr('href')
        .split('/')[2]
    )

    this.entryId = entryId
    this.titleName = titleName
      .substring(0, titleName.length - owner.length)
      .trim()
    this.entryUrl =
      URLS.BASE +
      $(elm)
        .find('a')
        .attr('href')
    this.titleSlug = $(elm)
      .find('a')
      .attr('href')
      .replace('/', '')

    this.owner = new UserForMember(this._request, owner, this._cookies)
    this.entry = new EntryForMember(this._request, entryId, this._cookies)
  }
}

module.exports = FollowedUserFavoriteEntry