diff --git a/lib/boardwise/coaches.ex b/lib/boardwise/coaches.ex index 9bb1a09..d4aa51c 100644 --- a/lib/boardwise/coaches.ex +++ b/lib/boardwise/coaches.ex @@ -22,7 +22,6 @@ defmodule BoardWise.Coaches do def list_coaches do Coach |> limit(6) - |> where(site: "lichess") |> Repo.all(prefix: @prefix) end diff --git a/lib/boardwise/languages.ex b/lib/boardwise/languages.ex new file mode 100644 index 0000000..a19b6c0 --- /dev/null +++ b/lib/boardwise/languages.ex @@ -0,0 +1,106 @@ +defmodule BoardWise.Languages do + @moduledoc """ + The Languages context. + """ + + import Ecto.Query, warn: false + alias BoardWise.Repo + + alias BoardWise.Languages.Language + + @prefix "coach_scraper" + + @doc """ + Returns the list of languages. + + ## Examples + + iex> list_languages() + [%Language{}, ...] + + """ + def list_languages do + Repo.all(Language, prefix: @prefix) + end + + @doc """ + Gets a single language. + + Raises `Ecto.NoResultsError` if the Language does not exist. + + ## Examples + + iex> get_language!(123) + %Language{} + + iex> get_language!(456) + ** (Ecto.NoResultsError) + + """ + def get_language!(id), do: Repo.get!(Language, id, prefix: @prefix) + + @doc """ + Creates a language. + + ## Examples + + iex> create_language(%{field: value}) + {:ok, %Language{}} + + iex> create_language(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_language(attrs \\ %{}) do + %Language{} + |> Language.changeset(attrs) + |> Repo.insert(prefix: @prefix) + end + + @doc """ + Updates a language. + + ## Examples + + iex> update_language(language, %{field: new_value}) + {:ok, %Language{}} + + iex> update_language(language, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_language(%Language{} = language, attrs) do + language + |> Language.changeset(attrs) + |> Repo.update(prefix: @prefix) + end + + @doc """ + Deletes a language. + + ## Examples + + iex> delete_language(language) + {:ok, %Language{}} + + iex> delete_language(language) + {:error, %Ecto.Changeset{}} + + """ + def delete_language(%Language{} = language) do + Repo.delete(language, prefix: @prefix) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking language changes. + + ## Examples + + iex> change_language(language) + %Ecto.Changeset{data: %Language{}} + + """ + def change_language(%Language{} = language, attrs \\ %{}) do + Language.changeset(language, attrs) + end +end diff --git a/lib/boardwise/languages/language.ex b/lib/boardwise/languages/language.ex new file mode 100644 index 0000000..d29f030 --- /dev/null +++ b/lib/boardwise/languages/language.ex @@ -0,0 +1,17 @@ +defmodule BoardWise.Languages.Language do + use Ecto.Schema + import Ecto.Changeset + + schema "languages" do + field :code, :string + field :name, :string + end + + @doc false + def changeset(language, attrs) do + language + |> cast(attrs, [:code, :name]) + |> validate_required([:code, :name]) + |> unique_constraint(:code_unique, name: :code_unique) + end +end diff --git a/lib/boardwise_web/controllers/language_controller.ex b/lib/boardwise_web/controllers/language_controller.ex new file mode 100644 index 0000000..2f74708 --- /dev/null +++ b/lib/boardwise_web/controllers/language_controller.ex @@ -0,0 +1,10 @@ +defmodule BoardWiseWeb.LanguageController do + use BoardWiseWeb, :controller + + alias BoardWise.Languages + + def index(conn, _params) do + langs = Languages.list_languages() + render(conn, :index, langs: langs) + end +end diff --git a/lib/boardwise_web/controllers/language_json.ex b/lib/boardwise_web/controllers/language_json.ex new file mode 100644 index 0000000..8287a1a --- /dev/null +++ b/lib/boardwise_web/controllers/language_json.ex @@ -0,0 +1,17 @@ +defmodule BoardWiseWeb.LanguageJSON do + alias BoardWise.Languages.Language + + @doc """ + Renders a list of coaches. + """ + def index(%{langs: langs}) do + %{data: for(lang <- langs, do: data(lang))} + end + + defp data(%Language{} = lang) do + %{ + code: lang.code, + name: lang.name + } + end +end diff --git a/lib/boardwise_web/router.ex b/lib/boardwise_web/router.ex index ba622cd..07ab82c 100644 --- a/lib/boardwise_web/router.ex +++ b/lib/boardwise_web/router.ex @@ -26,6 +26,7 @@ defmodule BoardWiseWeb.Router do pipe_through :api get "/coaches", CoachController, :index + get "/languages", LanguageController, :index end # Other scopes may use custom stacks. diff --git a/priv/repo/migrations/20231205220353_create_languages.exs b/priv/repo/migrations/20231205220353_create_languages.exs new file mode 100644 index 0000000..d0faf84 --- /dev/null +++ b/priv/repo/migrations/20231205220353_create_languages.exs @@ -0,0 +1,19 @@ +defmodule BoardWise.Repo.Migrations.CreateLanguages do + use Ecto.Migration + + @prefix "coach_scraper" + + def change do + create table(:languages, prefix: @prefix) do + add :code, :string, null: false + add :name, :string, null: false + end + + create unique_index( + :languages, + [:code], + prefix: @prefix, + name: "code_unique" + ) + end +end diff --git a/test/boardwise/languages_test.exs b/test/boardwise/languages_test.exs new file mode 100644 index 0000000..fc97180 --- /dev/null +++ b/test/boardwise/languages_test.exs @@ -0,0 +1,61 @@ +defmodule BoardWise.LanguagesTest do + use BoardWise.DataCase + + alias BoardWise.Languages + + describe "languages" do + alias BoardWise.Languages.Language + + import BoardWise.LanguagesFixtures + + @invalid_attrs %{code: nil, name: nil} + + test "list_languages/0 returns all languages" do + language = language_fixture() + assert Languages.list_languages() == [language] + end + + test "get_language!/1 returns the language with given id" do + language = language_fixture() + assert Languages.get_language!(language.id) == language + end + + test "create_language/1 with valid data creates a language" do + valid_attrs = %{code: "some code", name: "some name"} + + assert {:ok, %Language{} = language} = Languages.create_language(valid_attrs) + assert language.code == "some code" + assert language.name == "some name" + end + + test "create_language/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Languages.create_language(@invalid_attrs) + end + + test "update_language/2 with valid data updates the language" do + language = language_fixture() + update_attrs = %{code: "some updated code", name: "some updated name"} + + assert {:ok, %Language{} = language} = Languages.update_language(language, update_attrs) + assert language.code == "some updated code" + assert language.name == "some updated name" + end + + test "update_language/2 with invalid data returns error changeset" do + language = language_fixture() + assert {:error, %Ecto.Changeset{}} = Languages.update_language(language, @invalid_attrs) + assert language == Languages.get_language!(language.id) + end + + test "delete_language/1 deletes the language" do + language = language_fixture() + assert {:ok, %Language{}} = Languages.delete_language(language) + assert_raise Ecto.NoResultsError, fn -> Languages.get_language!(language.id) end + end + + test "change_language/1 returns a language changeset" do + language = language_fixture() + assert %Ecto.Changeset{} = Languages.change_language(language) + end + end +end diff --git a/test/support/fixtures/languages_fixtures.ex b/test/support/fixtures/languages_fixtures.ex new file mode 100644 index 0000000..da9c865 --- /dev/null +++ b/test/support/fixtures/languages_fixtures.ex @@ -0,0 +1,21 @@ +defmodule BoardWise.LanguagesFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `BoardWise.Languages` context. + """ + + @doc """ + Generate a language. + """ + def language_fixture(attrs \\ %{}) do + {:ok, language} = + attrs + |> Enum.into(%{ + code: "some code", + name: "some name" + }) + |> BoardWise.Languages.create_language() + + language + end +end