Skip to content

Commit 59b14fe

Browse files
committed
Associate the keywords with user
1 parent 0b46dee commit 59b14fe

7 files changed

Lines changed: 29 additions & 10 deletions

File tree

‎lib/google_crawler/accounts/user.ex‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ defmodule GoogleCrawler.Accounts.User do
1010
field :password, :string, virtual: true
1111
field :password_confirmation, :string, virtual: true
1212

13+
has_many :keywords, GoogleCrawler.Search.Keyword
14+
1315
timestamps()
1416
end
1517

‎lib/google_crawler/search.ex‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,17 @@ defmodule GoogleCrawler.Search do
4343
4444
## Examples
4545
46-
iex> create_keyword(%{field: value})
46+
iex> create_keyword(%User{}, %{field: value})
4747
{:ok, %Keyword{}}
4848
49-
iex> create_keyword(%{field: bad_value})
49+
iex> create_keyword(%User{}, %{field: bad_value})
5050
{:error, %Ecto.Changeset{}}
5151
5252
"""
53-
def create_keyword(attrs \\ %{}) do
53+
def create_keyword(attrs \\ %{}, user) do
5454
%Keyword{}
5555
|> Keyword.changeset(attrs)
56+
|> Ecto.Changeset.put_assoc(:user, user)
5657
|> Repo.insert()
5758
end
5859

‎lib/google_crawler/search/keyword.ex‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ defmodule GoogleCrawler.Search.Keyword do
55
schema "keywords" do
66
field :keyword, :string
77

8+
belongs_to :user, GoogleCrawler.Accounts.User
9+
810
timestamps()
911
end
1012

‎lib/google_crawler_web/controllers/upload_controller.ex‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ defmodule GoogleCrawlerWeb.UploadController do
55
alias GoogleCrawler.Search
66
alias GoogleCrawler.Search.KeywordFile
77

8+
@spec create(atom | %{__struct__: atom}, map) :: Plug.Conn.t()
89
def create(conn, %{"keyword_file" => keyword_file}) do
910
changeset = KeywordFile.changeset(%KeywordFile{}, keyword_file)
1011

1112
if changeset.valid? do
1213
file = get_change(changeset, :file, nil)
1314

1415
Search.parse_keywords_from_file!(file.path, file.content_type)
15-
|> create_and_trigger_google_search
16+
|> create_and_trigger_google_search(conn)
1617
|> put_error_flash_for_failed_keywords(conn)
1718
|> redirect(to: Routes.dashboard_path(conn, :index))
1819
else
@@ -23,11 +24,11 @@ defmodule GoogleCrawlerWeb.UploadController do
2324
end
2425

2526
# TODO: Trigger the scrapper background worker
26-
defp create_and_trigger_google_search(csv_result) do
27+
defp create_and_trigger_google_search(csv_result, conn) do
2728
csv_result
2829
|> Stream.map(fn keyword_row -> List.first(keyword_row) end)
2930
|> Stream.map(fn keyword -> %{keyword: keyword} end)
30-
|> Enum.map(&Search.create_keyword/1)
31+
|> Enum.map(&Search.create_keyword(&1, conn.assigns.current_user))
3132
end
3233

3334
defp put_error_flash_for_failed_keywords(create_result, conn) do
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
defmodule GoogleCrawler.Repo.Migrations.AddUserIdToKeywords do
2+
use Ecto.Migration
3+
4+
def change do
5+
alter table(:keywords) do
6+
add :user_id, references(:users)
7+
end
8+
end
9+
end

‎test/factories/keyword_factory.ex‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
defmodule GoogleCrawler.KeywordFactory do
22
alias GoogleCrawler.Search
3+
alias GoogleCrawler.UserFactory
34

45
def default_attrs do
56
%{
@@ -11,10 +12,10 @@ defmodule GoogleCrawler.KeywordFactory do
1112
Enum.into(attrs, default_attrs())
1213
end
1314

14-
def create(attrs \\ %{}) do
15+
def create(attrs \\ %{}, user \\ UserFactory.create()) do
1516
keyword_attrs = build_attrs(attrs)
1617

17-
{:ok, keyword} = Search.create_keyword(keyword_attrs)
18+
{:ok, keyword} = Search.create_keyword(keyword_attrs, user)
1819

1920
keyword
2021
end

‎test/google_crawler/search_test.exs‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ defmodule GoogleCrawler.SearchTest do
44
alias GoogleCrawler.Search
55
alias GoogleCrawler.Search.Keyword
66
alias GoogleCrawler.KeywordFactory
7+
alias GoogleCrawler.UserFactory
78

89
describe "keywords" do
910
test "list_keywords/0 returns all keywords" do
@@ -19,16 +20,18 @@ defmodule GoogleCrawler.SearchTest do
1920
end
2021

2122
test "create_keyword/1 with valid data creates a keyword" do
23+
user = UserFactory.create()
2224
keyword_attrs = KeywordFactory.build_attrs(%{keyword: "elixir"})
2325

24-
assert {:ok, %Keyword{} = keyword} = Search.create_keyword(keyword_attrs)
26+
assert {:ok, %Keyword{} = keyword} = Search.create_keyword(keyword_attrs, user)
2527
assert keyword.keyword == "elixir"
2628
end
2729

2830
test "create_keyword/1 with invalid data returns error changeset" do
31+
user = UserFactory.create()
2932
keyword_attrs = KeywordFactory.build_attrs(%{keyword: ""})
3033

31-
assert {:error, %Ecto.Changeset{}} = Search.create_keyword(keyword_attrs)
34+
assert {:error, %Ecto.Changeset{}} = Search.create_keyword(keyword_attrs, user)
3235
end
3336
end
3437

0 commit comments

Comments
 (0)