Skip to content

Commit

Permalink
Translate slack importer into an oban worker
Browse files Browse the repository at this point in the history
The slack importer now uses one call for each update, rather than
fetching and separately writing for each member.
  • Loading branch information
sorentwo committed Aug 2, 2021
1 parent 3a5c58a commit 9b57862
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 40 deletions.
13 changes: 6 additions & 7 deletions config/prod.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
28 changes: 28 additions & 0 deletions lib/changelog/oban_workers/slack_importer.ex
Original file line number Diff line number Diff line change
@@ -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
27 changes: 0 additions & 27 deletions lib/changelog/slack/tasks.ex

This file was deleted.

5 changes: 3 additions & 2 deletions lib/changelog_web/controllers/slack_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion lib/mix/tasks/slack.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 4 additions & 3 deletions test/changelog_web/controllers/slack_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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), %{
Expand All @@ -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
Expand Down

0 comments on commit 9b57862

Please sign in to comment.