Skip to content

Add syncing from the GitHub API to GitHub.Sync module #1099

@joshsmith

Description

@joshsmith

Problem

We should do something like the following for sync from GitHub API endpoints in GitHub.Sync:

  def issue_api(%GithubRepo{} = github_repo, %{"pull_request" => %{"url" => pull_request_url}} = payload) do
    # Pull Request
    Multi.new
    |> Multi.merge(__MODULE__, :return_repo, [github_repo])
    |> Multi.merge(__MODULE__, :fetch_pull_request, [pull_request_url])
    |> Multi.merge(GitHub.Sync.PullRequest, :sync, [payload])
    |> Multi.merge(GitHub.Sync.Issue, :sync, [payload])
    |> Multi.merge(GitHub.Sync.Comment, :sync, [payload])
    |> transact()
  end
  def issue_api(%GithubRepo{} = github_repo, %{} = issue) do
    # Issue
    Multi.new
    |> Multi.merge(__MODULE__, :return_repo, [github_repo])
    |> Multi.merge(GitHub.Sync.Issue, :sync, [issue])
    |> transact()
  end

  def comment_api(%GithubRepo{} = github_repo, %{"issue_url" => issue_url} = payload) do
    Multi.new
    |> Multi.merge(__MODULE__, :return_repo, [github_repo])
    |> Multi.merge(__MODULE__, :fetch_issue, [issue_url])
    |> Multi.merge(__MODULE__, :maybe_fetch_pull_request, [payload])
    |> Multi.merge(GitHub.Sync.PullRequest, :sync, [payload])
    |> Multi.merge(GitHub.Sync.Issue, :sync, [payload])
    |> Multi.merge(GitHub.Sync.Comment, :sync, [payload])
    |> transact()
  end

  def pull_request_api(%GithubRepo{} = github_repo, %{"issue_url" => issue_url} = payload) do
    Multi.new
    |> Multi.merge(__MODULE__, :return_repo, [github_repo])
    |> Multi.merge(__MODULE__, :fetch_issue, [issue_url])
    |> Multi.merge(GitHub.Sync.PullRequest, :sync, [payload])
    |> Multi.merge(GitHub.Sync.Issue, :sync, [payload])
    |> transact()
  end

  def return_repo(_, %GithubRepo{} = github_repo) do
    Multi.new
    |> Multi.run(:repo, fn _ -> github_repo end)
  end

  def maybe_fetch_pull_request(%{fetch_issue: %{"pull_request" => %{"url" => url}}} = changes, _) do
    fetch_pull_request(changes, url)
  end
  def maybe_fetch_pull_request(_, _), do: Multi.new

  def maybe_sync_pull_request(changes, %{} = payload) do
    Multi.new
    |> Multi.run(:sync_pull_request, fn _ -> GitHub.Sync.PullRequest.sync(changes, payload) end)
  end
  def maybe_sync_pull_request(_, _), do: Multi.new

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions