lib/api/issues/issues.ex

defmodule Noizu.Github.Api.Issues do

  require Noizu.Github
  import Noizu.Github

  def create(issue, options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = issue
    api_call(:post, base_url <> query_params, body, Noizu.Github.Issue, options)
  end


  def delete(issue, options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues/#{issue}"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:delete, base_url <> query_params, body, Noizu.Github.Issue, options)
  end

  def update(issue_number, update, options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues/#{issue_number}"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = update
    api_call(:patch, base_url <> query_params, body, Noizu.Github.Issue, options)
  end

  def get(issue_number, options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues/#{issue_number}"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:get, base_url <> query_params, body, Noizu.Github.Issue, options)
  end


  def lock(issue_number, options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues/#{issue_number}/lock"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:put, base_url <> query_params, body, Noizu.Github.Issue, options)
  end

  def unlock(issue_number, options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues/#{issue_number}/lock"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:delete, base_url <> query_params, body, Noizu.Github.Issue, options)
  end


  def search(search, options \\ nil)
  def search("", options), do: list(options)
  def search(search, options) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/search/issues?q=is:issue%20repo:#{owner}/#{repo}&20#{search}"
    state = get_field(:state, options, nil)

    query_options = [state]
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:get, base_url <> query_params, body, Noizu.Github.Issues, options)
  end

  def list(options \\ nil) do
    owner = repo_owner(options)
    repo = repo_name(options)

    base_url = github_base() <> "/repos/#{owner}/#{repo}/issues"
    state = get_field(:state, options, nil)

    query_options = [state]
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:get, base_url <> query_params, body, Noizu.Github.Issues, options)
  end


  def user_issues(options \\ nil) do
    base_url = github_base() <> "/repos/user/issues"
    query_options = []
                    |> Enum.filter(&(&1))
    query_params = (unless query_options == [] do
                      "?" <> Enum.join(query_options, "&")
                    else
                      ""
                    end)
    body = %{}
    api_call(:get, base_url <> query_params, body, Noizu.Github.Issues, options)
  end

end