diff --git a/.formatter.exs b/.formatter.exs index 592e7ef..ef8840c 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,5 +1,5 @@ [ - import_deps: [:phoenix], + import_deps: [:ecto, :ecto_sql, :phoenix], subdirectories: ["priv/*/migrations"], plugins: [Phoenix.LiveView.HTMLFormatter], inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"] diff --git a/.gitignore b/.gitignore index 6d28b6d..b10d9f9 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ ezcontainer_railway-*.tar npm-debug.log /assets/node_modules/ +db diff --git a/config/config.exs b/config/config.exs index a5cc750..d882e4c 100644 --- a/config/config.exs +++ b/config/config.exs @@ -11,6 +11,10 @@ config :ezcontainer_railway, ecto_repos: [EzcontainerRailway.Repo], generators: [timestamp_type: :utc_datetime] +# Configure your database +config :ezcontainer_railway, EzcontainerRailway.Repo, + database: "./db/db.sqlite3" + # Configures the endpoint config :ezcontainer_railway, EzcontainerRailwayWeb.Endpoint, url: [host: "localhost"], diff --git a/config/dev.exs b/config/dev.exs index 664feba..91a6e89 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -2,13 +2,7 @@ import Config # Configure your database config :ezcontainer_railway, EzcontainerRailway.Repo, - username: "postgres", - password: "postgres", - hostname: "localhost", - database: "ezcontainer_railway_dev", - stacktrace: true, - show_sensitive_data_on_connection_error: true, - pool_size: 10 + database: "./db/db.sqlite3" # For development, we disable any cache and enable # debugging and code reloading. diff --git a/lib/ezcontainer_railway/graphql_client.ex b/lib/ezcontainer_railway/graphql_client.ex index 876517f..865cb4f 100644 --- a/lib/ezcontainer_railway/graphql_client.ex +++ b/lib/ezcontainer_railway/graphql_client.ex @@ -10,7 +10,7 @@ defmodule EzcontainerRailway.GraphqlClient do case Req.Request.put_headers(Req.new(), [{"Authorization", "Bearer #{opts[:token]}"}]) |> Req.post(url: @graphql_url, json: body) do {:ok, resp} -> resp - {:error, _} -> :error + {:error, e} -> raise(e) end end end diff --git a/lib/ezcontainer_railway/projects.ex b/lib/ezcontainer_railway/projects.ex new file mode 100644 index 0000000..5a9f826 --- /dev/null +++ b/lib/ezcontainer_railway/projects.ex @@ -0,0 +1,14 @@ +defmodule EzcontainerRailway.Projects do + import Ecto.Query + + alias EzcontainerRailway.Repo + alias EzcontainerRailway.Project + + def get_project_by_user_id(user_id) do + Repo.one( + from p in Project, + where: p.user_id == ^user_id, + limit: 1 + ) + end +end diff --git a/lib/ezcontainer_railway/projects/project.ex b/lib/ezcontainer_railway/projects/project.ex new file mode 100644 index 0000000..835f532 --- /dev/null +++ b/lib/ezcontainer_railway/projects/project.ex @@ -0,0 +1,18 @@ +defmodule EzcontainerRailway.Project do + use Ecto.Schema + import Ecto.Changeset + + schema "projects" do + field :user_id, :string + field :project_id, :string + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(projects, attrs) do + projects + |> cast(attrs, [:user_id, :project_id]) + |> validate_required([:user_id, :project_id]) + end +end diff --git a/lib/ezcontainer_railway/railway.ex b/lib/ezcontainer_railway/railway.ex index 0789280..3bb99c0 100644 --- a/lib/ezcontainer_railway/railway.ex +++ b/lib/ezcontainer_railway/railway.ex @@ -8,6 +8,7 @@ defmodule EzcontainerRailway.Railway do edges { node { id + name } } } @@ -16,4 +17,53 @@ defmodule EzcontainerRailway.Railway do token: token ) end + + def create_service(container, token) when is_map(container) do + GraphqlClient.query( + """ + """, + variables: container + ) + end + + def create_project(name, token) do + GraphqlClient.query( + """ + mutation { + projectCreate(input: {name: $name}) { + id + name + } + } + """, + token: token, + variables: %{ "name" => name } + ) + |> format_response + end + + def is_token_valid?(token) do + resp = get_projects(token).body + + if has_errors?(resp) do + false + else + true + end + end + + def has_errors?(resp) when is_map(resp) do + has_errors_in_array?(resp["errors"]) + end + + defp format_response(resp) when is_map(resp) do + if has_errors?(resp) do + {:error, resp["error"]} + else + {:ok, resp["data"]} + end + end + + defp has_errors_in_array?([_|_]), do: true + defp has_errors_in_array?(_), do: false end diff --git a/lib/ezcontainer_railway/repo.ex b/lib/ezcontainer_railway/repo.ex index f696dac..d690042 100644 --- a/lib/ezcontainer_railway/repo.ex +++ b/lib/ezcontainer_railway/repo.ex @@ -1,2 +1,3 @@ defmodule EzcontainerRailway.Repo do + use Ecto.Repo, otp_app: :ezcontainer_railway, adapter: Ecto.Adapters.SQLite3 end diff --git a/lib/ezcontainer_railway_web/controllers/.#container_controller.ex b/lib/ezcontainer_railway_web/controllers/.#container_controller.ex deleted file mode 120000 index 7746d29..0000000 --- a/lib/ezcontainer_railway_web/controllers/.#container_controller.ex +++ /dev/null @@ -1 +0,0 @@ -benbot@darch.125027:1698169376 \ No newline at end of file diff --git a/lib/ezcontainer_railway_web/components/.#core_components.ex b/lib/ezcontainer_railway_web/controllers/.#page_controller.ex similarity index 100% rename from lib/ezcontainer_railway_web/components/.#core_components.ex rename to lib/ezcontainer_railway_web/controllers/.#page_controller.ex diff --git a/lib/ezcontainer_railway_web/controllers/container_controller.ex b/lib/ezcontainer_railway_web/controllers/container_controller.ex index 9bb4d6d..732a7aa 100644 --- a/lib/ezcontainer_railway_web/controllers/container_controller.ex +++ b/lib/ezcontainer_railway_web/controllers/container_controller.ex @@ -11,7 +11,7 @@ defmodule EzcontainerRailwayWeb.ContainerController do end def create(conn, params) do - + conn end def show(conn, params) do diff --git a/lib/ezcontainer_railway_web/controllers/session_controller.ex b/lib/ezcontainer_railway_web/controllers/session_controller.ex index 3f92d6f..867758c 100644 --- a/lib/ezcontainer_railway_web/controllers/session_controller.ex +++ b/lib/ezcontainer_railway_web/controllers/session_controller.ex @@ -1,30 +1,29 @@ defmodule EzcontainerRailwayWeb.SessionController do + alias EzcontainerRailway.Railway use EzcontainerRailwayWeb, :controller def token(conn, %{"railway_token" => token}) do - case token_valid?(token) do - true -> + case get_projects(token) do + resp when is_map(resp) -> + IO.inspect(resp) conn |> put_session(:railway_token, token) |> assign(:railway_token, token) |> redirect(to: "/containers") - false -> + nil -> conn |> put_flash(:error, "Invalid Token") |> redirect(to: "/") end end - defp token_valid?(token) do + defp get_projects(token) do resp = EzcontainerRailway.Railway.get_projects(token).body - if has_errors?(resp["errors"]) do - false + if Railway.has_errors?(resp) do + nil else - true + resp["data"] end end - - defp has_errors?([_|_]), do: true - defp has_errors?(_), do: false end diff --git a/lib/ezcontainer_railway_web/live/container_create_live.ex b/lib/ezcontainer_railway_web/live/container_create_live.ex new file mode 100644 index 0000000..6d27e3d --- /dev/null +++ b/lib/ezcontainer_railway_web/live/container_create_live.ex @@ -0,0 +1,39 @@ +defmodule EzcontainerRailwayWeb.ContainerCreateLive do + alias Phoenix.Component + use Phoenix.LiveView + + def render(assigns) do + ~H""" + <%= live_flash(@flash, :error) %> + <%= live_flash(@flash, :info) %> + + + + """ + end + + def mount(_params, _session, socket) do + form = Component.to_form(%{"container_name" => "", "contianer_tag" => ""}) + + {:ok, socket |> assign(:form, form)} + end +end diff --git a/lib/ezcontainer_railway_web/router.ex b/lib/ezcontainer_railway_web/router.ex index 9ecff2c..16e80e6 100644 --- a/lib/ezcontainer_railway_web/router.ex +++ b/lib/ezcontainer_railway_web/router.ex @@ -21,7 +21,8 @@ defmodule EzcontainerRailwayWeb.Router do get "/", PageController, :home post "/token", SessionController, :token - resources("/containers", ContainerController, only: [:index, :create, :show]) + live "/containers", ContainerCreateLive + resources("/containers", ContainerController, only: [:create, :show]) end # Other scopes may use custom stacks. diff --git a/mix.exs b/mix.exs index ec6892e..5e7a88d 100644 --- a/mix.exs +++ b/mix.exs @@ -36,6 +36,9 @@ defmodule EzcontainerRailway.MixProject do {:phoenix_html, "~> 3.3"}, {:phoenix_live_reload, "~> 1.2", only: :dev}, {:phoenix_live_view, "~> 0.20.1"}, + {:phoenix_ecto, "~> 4.4"}, + {:ecto_sql, "~> 3.10"}, + {:ecto_sqlite3, "~> 0.12"}, {:floki, ">= 0.30.0", only: :test}, {:phoenix_live_dashboard, "~> 0.8.2"}, {:esbuild, "~> 0.7", runtime: Mix.env() == :dev}, @@ -60,8 +63,10 @@ defmodule EzcontainerRailway.MixProject do # See the documentation for `Mix` for more info on aliases. defp aliases do [ - setup: ["deps.get", "assets.setup", "assets.build"], - test: ["test"], + setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"], + "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], + "ecto.reset": ["ecto.drop", "ecto.setup"], + test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], "assets.build": ["tailwind default", "esbuild default"], "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"] diff --git a/mix.lock b/mix.lock index 1718229..a32a90c 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,6 @@ %{ "castore": {:hex, :castore, "1.0.4", "ff4d0fb2e6411c0479b1d965a814ea6d00e51eb2f58697446e9c41a97d940b28", [:mix], [], "hexpm", "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8"}, + "cc_precompiler": {:hex, :cc_precompiler, "0.1.8", "933a5f4da3b19ee56539a076076ce4d7716d64efc8db46fd066996a7e46e2bfd", [:mix], [{:elixir_make, "~> 0.7.3", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "176bdf4366956e456bf761b54ad70bc4103d0269ca9558fd7cee93d1b3f116db"}, "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"}, @@ -8,8 +9,11 @@ "dns_cluster": {:hex, :dns_cluster, "0.1.1", "73b4b2c3ec692f8a64276c43f8c929733a9ab9ac48c34e4c0b3d9d1b5cd69155", [:mix], [], "hexpm", "03a3f6ff16dcbb53e219b99c7af6aab29eb6b88acf80164b4bd76ac18dc890b3"}, "ecto": {:hex, :ecto, "3.10.3", "eb2ae2eecd210b4eb8bece1217b297ad4ff824b4384c0e3fdd28aaf96edd6135", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "44bec74e2364d491d70f7e42cd0d690922659d329f6465e89feb8a34e8cd3433"}, "ecto_sql": {:hex, :ecto_sql, "3.10.2", "6b98b46534b5c2f8b8b5f03f126e75e2a73c64f3c071149d32987a5378b0fdbd", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "68c018debca57cb9235e3889affdaec7a10616a4e3a80c99fa1d01fdafaa9007"}, + "ecto_sqlite3": {:hex, :ecto_sqlite3, "0.12.0", "9ee845ac45a76e3c5c0fe65898f3538f5b0969912a95f0beef3d4ae8e63f6a06", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.10", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:exqlite, "~> 0.9", [hex: :exqlite, repo: "hexpm", optional: false]}], "hexpm", "4eaf8550df1fd0043bcf039a5dce407fd8afc30a115ced173fe6b9815eeedb55"}, + "elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"}, "esbuild": {:hex, :esbuild, "0.7.1", "fa0947e8c3c3c2f86c9bf7e791a0a385007ccd42b86885e8e893bdb6631f5169", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "66661cdf70b1378ee4dc16573fcee67750b59761b2605a0207c267ab9d19f13c"}, "expo": {:hex, :expo, "0.4.1", "1c61d18a5df197dfda38861673d392e642649a9cef7694d2f97a587b2cfb319b", [:mix], [], "hexpm", "2ff7ba7a798c8c543c12550fa0e2cbc81b95d4974c65855d8d15ba7b37a1ce47"}, + "exqlite": {:hex, :exqlite, "0.16.0", "d9a8d22493f135736cfc9a542cf5298dfa276c198f688ea4b08bd2c03f2a79d3", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "0ff541e1ead5cfde1206e3c2de8d746a7bf627fcc4afa606601be89f75d0057e"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "finch": {:hex, :finch, "0.16.0", "40733f02c89f94a112518071c0a91fe86069560f5dbdb39f9150042f44dcfb1a", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f660174c4d519e5fec629016054d60edd822cdfe2b7270836739ac2f97735ec5"}, "floki": {:hex, :floki, "0.35.1", "b21cf592ed38c1207c5ea52120a2e81d6ecba11337a633a3f29ec17a64033178", [:mix], [], "hexpm", "f126e3eb814f131c21befeeeb773d2c4e2331ce05214c1a9844a3edde5c69003"}, diff --git a/priv/repo/migrations/20231025082520_create_projects.exs b/priv/repo/migrations/20231025082520_create_projects.exs new file mode 100644 index 0000000..81be92a --- /dev/null +++ b/priv/repo/migrations/20231025082520_create_projects.exs @@ -0,0 +1,12 @@ +defmodule EzcontainerRailway.Repo.Migrations.CreateProjects do + use Ecto.Migration + + def change do + create table(:projects) do + add :user_id, :string + add :project_id, :string + + timestamps(type: :utc_datetime) + end + end +end