diff --git a/config/prod.exs b/config/prod.exs index 8f48fe309c..4eca6a957b 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -55,13 +55,12 @@ config :changelog, Oban, Oban.Plugins.Pruner, Oban.Plugins.Stager, {Oban.Plugins.Cron, - timezone: "US/Central", - crons: [ - {"0 4 * * *", Changelog.ObanWorkers.StatsProcessor}, - {"0 3 * * *", Changelog.Slack.Tasks}, - {"* * * * *", Changelog.ObanWorkers.NewsPublisher} - ] - } + timezone: "US/Central", + crons: [ + {"0 4 * * *", Changelog.ObanWorkers.StatsProcessor}, + {"0 3 * * *", Changelog.ObanWorkers.SlackImporter}, + {"* * * * *", Changelog.ObanWorkers.NewsPublisher} + ]} ] config :changelog, Changelog.PromEx, diff --git a/lib/changelog/oban_workers/slack_importer.ex b/lib/changelog/oban_workers/slack_importer.ex new file mode 100644 index 0000000000..ed55bc0bb6 --- /dev/null +++ b/lib/changelog/oban_workers/slack_importer.ex @@ -0,0 +1,28 @@ +defmodule Changelog.ObanWorkers.SlackImporter do + use Oban.Worker, queue: :scheduled + + alias Changelog.{Person, Repo} + alias Changelog.Slack.Client + + import Ecto.Query + + @impl Oban.Worker + def perform(_job) do + %{"members" => members} = Client.list() + + for %{"id" => id, "profile" => profile} <- members do + email = Map.get(profile, "email", "") + + import_member_id(id, email) + end + + :ok + end + + def import_member_id(id, email) do + Person + |> where([p], p.email == ^email) + |> where([p], is_nil(p.slack_id) or p.slack_id == "pending") + |> Repo.update_all(set: [slack_id: id]) + end +end diff --git a/lib/changelog/slack/tasks.ex b/lib/changelog/slack/tasks.ex deleted file mode 100644 index e12a38dd35..0000000000 --- a/lib/changelog/slack/tasks.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule Changelog.Slack.Tasks do - alias Changelog.{Person, Repo} - alias Changelog.Slack.Client - - import Ecto.Query - - def import_member_ids do - list = Client.list() - - for member <- Map.get(list, "members") do - id = Map.get(member, "id") - email = get_in(member, ["profile", "email"]) || "" - import_member_id(id, email) - end - end - - def import_member_id(id, email) do - query = - from p in Person, - where: p.email == ^email, - where: is_nil(p.slack_id) or p.slack_id == "pending" - - if person = Repo.one(query) do - Repo.update(Ecto.Changeset.change(person, slack_id: id)) - end - end -end diff --git a/lib/changelog_web/controllers/slack_controller.ex b/lib/changelog_web/controllers/slack_controller.ex index f97413c3b9..13d61ad1d1 100644 --- a/lib/changelog_web/controllers/slack_controller.ex +++ b/lib/changelog_web/controllers/slack_controller.ex @@ -2,7 +2,8 @@ defmodule ChangelogWeb.SlackController do use ChangelogWeb, :controller alias Changelog.Episode - alias Changelog.Slack.{Client, Countdown, Messages, Tasks} + alias Changelog.Slack.{Client, Countdown, Messages} + alias Changelog.ObanWorkers.SlackImporter require Logger @@ -32,7 +33,7 @@ defmodule ChangelogWeb.SlackController do id = Map.get(member, "id") email = get_in(member, ["profile", "email"]) || "" Client.im(id, Messages.welcome()) - Tasks.import_member_id(id, email) + SlackImporter.import_member_id(id, email) json(conn, %{}) end diff --git a/lib/mix/tasks/slack.ex b/lib/mix/tasks/slack.ex index b5fdd2015c..2df05e5822 100644 --- a/lib/mix/tasks/slack.ex +++ b/lib/mix/tasks/slack.ex @@ -5,6 +5,6 @@ defmodule Mix.Tasks.Changelog.Slack do def run(_) do Mix.Task.run("app.start") - Changelog.Slack.Tasks.import_member_ids() + Changelog.ObanWorkers.SlackImporter.perform(%Oban.Job{}) end end diff --git a/test/changelog_web/controllers/slack_controller_test.exs b/test/changelog_web/controllers/slack_controller_test.exs index 4540036921..fd8eebacde 100644 --- a/test/changelog_web/controllers/slack_controller_test.exs +++ b/test/changelog_web/controllers/slack_controller_test.exs @@ -3,7 +3,8 @@ defmodule ChangelogWeb.SlackControllerTest do import Mock - alias Changelog.Slack.{Client, Messages, Tasks} + alias Changelog.Slack.{Client, Messages} + alias Changelog.ObanWorkers.SlackImporter describe "the countdown endpoint" do setup do @@ -71,7 +72,7 @@ defmodule ChangelogWeb.SlackControllerTest do } do with_mocks([ {Client, [], [im: fn _, _ -> nil end]}, - {Tasks, [], [import_member_id: fn _, _ -> nil end]} + {SlackImporter, [], [import_member_id: fn _, _ -> nil end]} ]) do conn = post(conn, Routes.slack_path(conn, :event), %{ @@ -89,7 +90,7 @@ defmodule ChangelogWeb.SlackControllerTest do }) assert called(Client.im("U2XU53R", Messages.welcome())) - assert called(Tasks.import_member_id("U2XU53R", "grace@hopper.com")) + assert called(SlackImporter.import_member_id("U2XU53R", "grace@hopper.com")) assert conn.status == 200 end end