diff --git a/lib/code_corps/github/adapters/task.ex b/lib/code_corps/github/adapters/task.ex index 1e634bc3a..85605f40a 100644 --- a/lib/code_corps/github/adapters/task.ex +++ b/lib/code_corps/github/adapters/task.ex @@ -1,7 +1,7 @@ defmodule CodeCorps.GitHub.Adapters.Task do @moduledoc """ Used to adapt a GitHub issue payload into attributes for creating or updating - a `CodeCorps.Task`. + a `CodeCorps.Task` and vice-versa. """ alias CodeCorps.{ @@ -18,18 +18,26 @@ defmodule CodeCorps.GitHub.Adapters.Task do {:title, ["title"]} ] + @doc ~S""" + Converts a GitHub issue payled into a set of attributes used to update or + create a `Task` record. + """ @spec from_issue(map) :: map def from_issue(%{} = payload) do payload |> MapTransformer.transform(@mapping) end + @autogenerated_github_keys ~w(created_at number updated_at) + + @doc ~S""" + Converts a `Task` into a set of attributes used to update or create an + associated GitHub issue + """ @spec to_issue(Task.t) :: map def to_issue(%Task{} = task) do task |> Map.from_struct |> MapTransformer.transform_inverse(@mapping) - |> Map.delete("created_at") - |> Map.delete("number") - |> Map.delete("updated_at") + |> Map.drop(@autogenerated_github_keys) end end diff --git a/lib/code_corps/github/event/issues/changeset_builder.ex b/lib/code_corps/github/event/issues/changeset_builder.ex index 7737fcabe..d1fabbb73 100644 --- a/lib/code_corps/github/event/issues/changeset_builder.ex +++ b/lib/code_corps/github/event/issues/changeset_builder.ex @@ -16,7 +16,10 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilder do alias Ecto.Changeset @doc ~S""" - Constructs a changeset for syncing a task when processing an Issues webhook + Constructs a changeset for syncing a `Task` when processing an Issues or + IssueComment webhook. + + The changeset can be used to create or update a `Task` """ @spec build_changeset(Task.t, map, ProjectGithubRepo.t, User.t) :: Changeset.t def build_changeset( @@ -31,6 +34,8 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilder do end end + @create_attrs ~w(created_at github_issue_number markdown modified_at status title)a + @spec create_changeset(Task.t, map, ProjectGithubRepo.t, User.t) :: Changeset.t defp create_changeset( %Task{} = task, %{} = issue_attrs, @@ -41,7 +46,7 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilder do TaskList |> Repo.get_by(project_id: project_id, inbox: true) task - |> Changeset.cast(TaskAdapter.from_issue(issue_attrs), [:created_at, :github_issue_number, :markdown, :modified_at, :status, :title]) + |> Changeset.cast(TaskAdapter.from_issue(issue_attrs), @create_attrs) |> MarkdownRendererService.render_markdown_to_html(:markdown, :body) |> Changeset.put_change(:created_on, "github") |> Changeset.put_change(:github_repo_id, github_repo_id) @@ -55,9 +60,11 @@ defmodule CodeCorps.GitHub.Event.Issues.ChangesetBuilder do |> Changeset.assoc_constraint(:user) end - defp update_changeset(%Task{} = task, issue_attrs) do + @update_attrs ~w(github_issue_number markdown modified_at status title)a + @spec update_changeset(Task.t, map) :: Changeset.t + defp update_changeset(%Task{} = task, %{} = issue_attrs) do task - |> Changeset.cast(TaskAdapter.from_issue(issue_attrs), [:github_issue_number, :markdown, :modified_at, :status, :title]) + |> Changeset.cast(TaskAdapter.from_issue(issue_attrs), @update_attrs) |> MarkdownRendererService.render_markdown_to_html(:markdown, :body) |> Changeset.put_change(:updated_on, "github") |> Changeset.validate_required([:project_id, :title, :user_id])