Source: index.js

import axios from 'axios'
import queryString from 'query-string'

/**
 * Modül ve methodlar zaman içerisinde değişebilir
 * Eksik birçok method bulunmakta
 * @author c0b41 <cobaimelan@protonmail.ch>
 * @copyright c0b41 2018 MIT
 */
class EksiClient {
  /**
   * @param options {Object}
   * @param options.uri {String} api urlesi
   * @param options.client_secret {String} api client_secret id'si
   * @param version {string} api servisi sürümü
   */
  constructor({ uri, client_secret }, version = null) {
    this.uri = uri || ''
    this.client_secret = client_secret || ''
    this.client_version = version || 'v1'

    this.client = axios.create({
      baseURL: this.uri
    })
  }

  /**
   * Api servisine istek atabilmek için kullanıcı verileri set etmeye yarıyor
   * @param env  {Object}
   * @param env.access_token {String}
   * @param env.nick {String}
   * @param env.user_id {Number}
   * @return {Void}
   */
  define(env) {
    this.client = axios.create({
      baseURL: this.uri,
      headers: {
        authorization: `bearer ${env.access_token}`
      }
    })

    this.env = env
  }

  /**
   * Api servisi üzerinden access token almak için kullanılıyor
   * @async
   * @param params {Object}
   * @param params.username {String}
   * @param params.password {String}
   * @return {Promise}
   */
  async getAccessToken(params = {}) {
    return await this.client.post(
      `token`,
      queryString.stringify(
        Object.assign(
          {
            grant_type: 'password',
            client_secret: this.client_secret
          },
          params
        )
      )
    )

    // Todo: axios https://github.com/axios/axios/issues/362
  }

  /**
   * Kendi kullanıcınıza ait verilere ulaşmak için
   * @async
   * @param params {Object}
   * @return {Promise}
   */
  async getMe(params = {}) {
    return await this.client.get(
      `${this.client_version}/user/${this.env.nick}`,
      { params }
    )
  }

  /**
   * Ekşi sözlük apisinde tokeninizi yenilemek için henüz bir route yok
   * tokeninizi yenilemek isterseniz @getAccessToken methodunu kullanmanız gerek
   * @todo not working.
   */
  async setRefreshAccessToken() {}

  /**
   * Entry'e erişmek için
   * @async
   * @params entry_id {Number} Entry id
   * @param params {Object}
   * @return {Promise}
   */
  async getEntry(entry_id, params = {}) {
    return await this.client.get(`${this.client_version}/entry/${entry_id}`, {
      params
    })
  }

  /**
   * Kendinize ait entryleri erişmek için
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getMyEntrys(params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/user/${this.env.nick}/entries`,
      { params }
    )
  }

  /**
   * Kendinize ait favorileri erişmek için
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getMyFavorites(params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/user/${this.env.nick}/favorites`,
      { params }
    )
  }

  /**
   * Başka bir kullanıcıya ait verilere ulaşmak için
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async getUser(nick, params = {}) {
    return await this.client.get(`${this.client_version}/user/${nick}`, {
      params
    })
  }

  /**
   * Konu takip et
   * @async
   * @param topic_id {Number} Konu id
   * @param params {Object}
   * @return {Promise}
   */
  async setTopicFollow(topic_id, params = {}) {
    return await this.client.get(
      `${this.client_version}/topic/follow/${topic_id}`,
      {
        params
      }
    )
  }

  /**
   * Konu takibi bırakma
   * @async
   * @param topic_id {Number} Konu id
   * @param params {Object}
   * @return {Promise}
   */
  async setTopicUnfollow(topic_id, params = {}) {
    return await this.client.get(
      `${this.client_version}/topic/unfollow/${topic_id}`,
      {
        params
      }
    )
  }

  /**
   * Entry Upvote
   * @async
   * @param entry_id {Number} Entry id
   * @param params {Object}
   * @return {Promise}
   */
  async setEntryUpvote(entry_id, params = {}) {
    return await this.client.post(
      `${this.client_version}/entry/vote/${entry_id}/1`,
      {
        params
      }
    )
  }

  /**
   * Entry Downvote
   * @async
   * @param entry_id {Number} Entry id
   * @param params {Object}
   * @return {Promise}
   */
  async setEntryDownvote(entry_id, params = {}) {
    return await this.client.post(
      `${this.client_version}/entry/vote/${entry_id}/-1`,
      {
        params
      }
    )
  }

  /**
   * Entry Favorite
   * @async
   * @param entry_id {Number} Entry id
   * @param params {Object}
   * @return {Promise}
   */
  async setEntryFavorite(entry_id, params = {}) {
    return await this.client.post(
      `${this.client_version}/entry/${entry_id}/favorite`,
      {
        params
      }
    )
  }

  /**
   * Entry Unfavorite
   * @async
   * @param entry_id {Number} Entry id
   * @param params {Object}
   * @return {Promise}
   */
  async setEntryUnfavorite(entry_id, params = {}) {
    return await this.client.post(
      `${this.client_version}/entry/${entry_id}/unfavorite`,
      {
        params
      }
    )
  }

  /**
   * Kullanıcı engelleme
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async setUserBlock(nick, params = {}) {
    return await this.client.get(`${this.client_version}/user/${nick}/block`, {
      params
    })
  }

  /**
   * Kullanıcı engelli kaldırma
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async setUserUnblock(nick, params = {}) {
    return await this.client.get(
      `${this.client_version}/user/${nick}/unblock`,
      {
        params
      }
    )
  }

  /**
   * Kullanıcı konularını engelleme
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async setUserTopicsBlock(nick, params = {}) {
    return await this.client.get(
      `${this.client_version}/user/${nick}/indextitlesblock`,
      {
        params
      }
    )
  }

  /**
   * Kullanıcı konularını engeli kaldırma
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async setUserTopicsUnblock(nick, params = {}) {
    return await this.client.get(
      `${this.client_version}/user/${nick}/removeindextitlesblock`,
      {
        params
      }
    )
  }

  /**
   * Kullanıcı takip et
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async setUserFollow(nick, params = {}) {
    return await this.client.get(`${this.client_version}/user/${nick}/follow`, {
      params
    })
  }

  /**
   * Kullanıcı takipden çıkar
   * @async
   * @param nick {String} Kullanıcı Adı
   * @param params {Object}
   * @return {Promise}
   */
  async setUserUnfollow(nick, params = {}) {
    return await this.client.get(
      `${this.client_version}/user/${nick}/unfollow`,
      {
        params
      }
    )
  }

  /**
   * Başka bir kullanıcıya ait entryleri erişmek için
   * @async
   * @param nick {String} Kullanıcı adı
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getUserEntrys(nick, params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/user/${nick}/entries`,
      { params }
    )
  }

  /**
   * Başka bir kullanıcıya ait favorileri erişmek için
   * @async
   * @param nick {String} Kullanıcı adı
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getUserFavorites(nick, params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/user/${nick}/favorites`,
      { params }
    )
  }

  /**
   * Kendinize ait mesajlara erişmek için
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getMessages(params = { p: 1 }) {
    return await this.client.get(`${this.client_version}/message`, { params })
  }

  /**
   * Takip ettiğiniz konuların listesi için
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getEvents(params = { p: 1 }) {
    return await this.client.get(`${this.client_version}/index/olay`, {
      params
    })
  }

  /**
   * Mesajı getirmek için
   * @async
   * @param nick {String} Kullanıcı adı
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getMessage(nick, params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/message/thread/nick/${nick}`,
      { params }
    )
  }

  /**
   * Kendinize ait okunmamış mesaj sayısı
   * @async
   * @param params {Object}
   * @return {Promise}
   */
  async getMyUnreadMessagesCount(params = {}) {
    return await this.client.get(
      `${this.client_version}/message/totalunreadthreadcount`,
      { params }
    )
  }

  /**
   * Takip edilen okunmamış konular'a ait okunmamış konu sayısı
   * @async
   * @param params {Object}
   * @return {Promise}
   */
  async getMyUnreadTopicsCount(params = {}) {
    return await this.client.get(
      `${this.client_version}/topic/unreadtopiccount`,
      { params }
    )
  }

  /**
   * Konuya bugün girilen entrylere erişmek için
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   * @todo not working
   */
  async getTopicEntrysToday(topic_id, params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/topic/${topic_id}/today`,
      { params }
    )
  }

  /**
   * Konuya girilen entrylere erişmek için
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @param params.day {String} Tarih
   * @return {Promise}
   * @todo not working
   */
  async getTopicEntrys(topic_id, params = { p: 1 }) {
    return await this.client.get(`${this.client_version}/topic/${topic_id}`, {
      params
    })
  }

  /**
   * Bugün girilen konular
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getTodayTopics(params = { p: 1 }) {
    return await this.client.get(`${this.client_version}/index/today`, {
      params
    })
  }

  /**
   * Bugün girilen popüler konular
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getPopularTopics(params = { p: 1 }) {
    return await this.client.get(`${this.client_version}/index/popular`, {
      params
    })
  }

  /**
   * Takip ettiğiniz yazarların entry girdiği konular
   * @async
   * @param params {Object}
   * @param params.p {Number} Sayfa sayısı
   * @return {Promise}
   */
  async getMyBuddysTopics(params = { p: 1 }) {
    return await this.client.get(`${this.client_version}/index/feed/entry`, {
      params
    })
  }

  /**
   * Takip ettiğiniz yazarların favorilediği entryler
   * @async
   * @param {Object} params - ##
   * @return {Promise}
   */
  async getMyBuddysFavorites(params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/index/feed/favorites`,
      { params }
    )
  }

  /**
   * Ekşi sözlük kanalları
   * @async
   * @param {Object} params - ##
   * @return {Promise}
   */
  async getChannels(params = {}) {
    return await this.client.get(`${this.client_version}/channel/list`, {
      params
    })
  }

  /**
   * Ekşi sözlük Kanallarına ait konuları getirmek için
   * @async
   * @param name {String} Kanal Adı
   * @param {Object} params - ##
   * @param {Object} params.p - Sayfa sayısı
   * @return {Promise}
   */
  async getChannel(name, params = { p: 1 }) {
    return await this.client.get(
      `${this.client_version}/index/channel/${name}`,
      { params }
    )
  }

  /**
   *
   * @async
   * @param query {String}  Aranan kelime
   * @return {Promise}
   */
  async getAutoCompletes(query) {
    return await this.client.get(
      `${this.client_version}/autocomplete/query/${query}`
    )
  }

  /**
   *
   * @async
   * @param params {Object}
   * @param params.term {String} Aranan kelime
   * @return {Promise}
   * @todo not working
   */
  async setSearch(params = { term: null }) {
    return await this.client.get(`${this.client_version}/topic/query`, {
      params
    })
  }
}

export default EksiClient