diff --git a/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex b/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex new file mode 100644 index 000000000..e7e06ec66 --- /dev/null +++ b/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex @@ -0,0 +1,24 @@ +defmodule Codebattle.Utils.PopulateUsers do + @moduledoc false + + def from_csv(file) do + utc_now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + + users = + File.stream!(file) + |> NimbleCSV.RFC4180.parse_stream() + |> Stream.map(&row_to_user(&1, utc_now)) + |> Enum.to_list() + + Codebattle.Repo.insert_all(Codebattle.User, users) + end + + defp row_to_user([name, password], now) do + %{ + name: name, + password_hash: Bcrypt.hash_pwd_salt(password), + inserted_at: now, + updated_at: now + } + end +end diff --git a/services/app/apps/codebattle/test/codebattle/utils/populate_users_test.exs b/services/app/apps/codebattle/test/codebattle/utils/populate_users_test.exs new file mode 100644 index 000000000..8b57506f4 --- /dev/null +++ b/services/app/apps/codebattle/test/codebattle/utils/populate_users_test.exs @@ -0,0 +1,20 @@ +defmodule Codebattle.Utils.PopulateUsersTest do + use Codebattle.DataCase, async: true + + test "from_csv" do + csv = """ + name,password + user1,p@ssw0rd! + user2,adminadmin1234 + user3,changem3 + user4,"hop hey lala ley" + """ + + {fd, path} = Temp.open!() + IO.write(fd, csv) + File.close(fd) + + assert {4, nil} = Codebattle.Utils.PopulateUsers.from_csv(path) + assert %{name: "user1"} = Codebattle.User.authenticate("user1", "p@ssw0rd!") + end +end