From 023ad47ae4fa283b4cbea1533ae8d653759a188c Mon Sep 17 00:00:00 2001 From: benbot Date: Wed, 25 Oct 2023 05:41:01 -0400 Subject: [PATCH] just need to add creating services, deploying them, and showing logs --- lib/ezcontainer_railway/application.ex | 2 +- lib/ezcontainer_railway/projects.ex | 22 ++++++++ lib/ezcontainer_railway/railway.ex | 53 ++++++++++++------- .../controllers/session_controller.ex | 14 +++-- .../plugs/railway_check.ex | 26 +++++++++ lib/ezcontainer_railway_web/router.ex | 11 +++- 6 files changed, 99 insertions(+), 29 deletions(-) create mode 100644 lib/ezcontainer_railway_web/plugs/railway_check.ex diff --git a/lib/ezcontainer_railway/application.ex b/lib/ezcontainer_railway/application.ex index 2a41aa6..7edb1df 100644 --- a/lib/ezcontainer_railway/application.ex +++ b/lib/ezcontainer_railway/application.ex @@ -9,7 +9,7 @@ defmodule EzcontainerRailway.Application do def start(_type, _args) do children = [ EzcontainerRailwayWeb.Telemetry, - # EzcontainerRailway.Repo, + EzcontainerRailway.Repo, {DNSCluster, query: Application.get_env(:ezcontainer_railway, :dns_cluster_query) || :ignore}, {Phoenix.PubSub, name: EzcontainerRailway.PubSub}, # Start the Finch HTTP client for sending emails diff --git a/lib/ezcontainer_railway/projects.ex b/lib/ezcontainer_railway/projects.ex index 5a9f826..4f77189 100644 --- a/lib/ezcontainer_railway/projects.ex +++ b/lib/ezcontainer_railway/projects.ex @@ -3,6 +3,19 @@ defmodule EzcontainerRailway.Projects do alias EzcontainerRailway.Repo alias EzcontainerRailway.Project + alias EzcontainerRailway.Railway + + def get_project_by_token(token) do + {:ok, user_id} = Railway.get_user_id(token) + + get_project_by_user_id(user_id) + + Repo.one( + from p in Project, + where: p.user_id == ^user_id, + limit: 1 + ) + end def get_project_by_user_id(user_id) do Repo.one( @@ -11,4 +24,13 @@ defmodule EzcontainerRailway.Projects do limit: 1 ) end + + def create_project(token) do + {:ok, project_id} = Railway.create_project(token) + {:ok, user_id} = Railway.get_user_id(token) + + %Project{} + |> Project.changeset(%{user_id: user_id, project_id: project_id}) + |> Repo.insert! + end end diff --git a/lib/ezcontainer_railway/railway.ex b/lib/ezcontainer_railway/railway.ex index 3bb99c0..6b06fe5 100644 --- a/lib/ezcontainer_railway/railway.ex +++ b/lib/ezcontainer_railway/railway.ex @@ -1,7 +1,7 @@ defmodule EzcontainerRailway.Railway do alias EzcontainerRailway.GraphqlClient def get_projects(token) do - GraphqlClient.query( + resp = GraphqlClient.query( """ query { projects { @@ -15,7 +15,12 @@ defmodule EzcontainerRailway.Railway do } """, token: token - ) + ) |> format_response + + case resp do + {:error, _} -> resp + {:ok, data} -> {:ok, data["projects"]["edges"]} + end end def create_service(container, token) when is_map(container) do @@ -26,41 +31,51 @@ defmodule EzcontainerRailway.Railway do ) end - def create_project(name, token) do - GraphqlClient.query( + def create_project(token) do + resp = GraphqlClient.query( """ mutation { - projectCreate(input: {name: $name}) { + projectCreate(input: {}) { id name } } """, - token: token, - variables: %{ "name" => name } + token: token ) |> format_response - end - def is_token_valid?(token) do - resp = get_projects(token).body - - if has_errors?(resp) do - false - else - true + case resp do + {:error, _} -> resp + {:ok, data} -> {:ok, data["projectCreate"]["id"]} end end - def has_errors?(resp) when is_map(resp) do + def get_user_id(token) do + {:ok, resp} = GraphqlClient.query( + """ + query { + me { + id + } + } + """, + token: token + ) + |> format_response + + {:ok, resp["me"]["id"]} + end + + def has_errors?(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"]} + if has_errors?(resp.body) do + {:error, resp.body["errors"]} else - {:ok, resp["data"]} + {:ok, resp.body["data"]} end end diff --git a/lib/ezcontainer_railway_web/controllers/session_controller.ex b/lib/ezcontainer_railway_web/controllers/session_controller.ex index 867758c..dc704e2 100644 --- a/lib/ezcontainer_railway_web/controllers/session_controller.ex +++ b/lib/ezcontainer_railway_web/controllers/session_controller.ex @@ -4,8 +4,7 @@ defmodule EzcontainerRailwayWeb.SessionController do def token(conn, %{"railway_token" => token}) do case get_projects(token) do - resp when is_map(resp) -> - IO.inspect(resp) + resp when is_list(resp) -> conn |> put_session(:railway_token, token) |> assign(:railway_token, token) @@ -18,12 +17,11 @@ defmodule EzcontainerRailwayWeb.SessionController do end defp get_projects(token) do - resp = EzcontainerRailway.Railway.get_projects(token).body - - if Railway.has_errors?(resp) do - nil - else - resp["data"] + case EzcontainerRailway.Railway.get_projects(token) do + {:error, _} -> + nil + {:ok, data} -> + data end end end diff --git a/lib/ezcontainer_railway_web/plugs/railway_check.ex b/lib/ezcontainer_railway_web/plugs/railway_check.ex new file mode 100644 index 0000000..1b03a1f --- /dev/null +++ b/lib/ezcontainer_railway_web/plugs/railway_check.ex @@ -0,0 +1,26 @@ +defmodule EzcontainerRailwayWeb.RailwayCheck do + alias EzcontainerRailway.Projects + alias EzcontainerRailway.Railway + alias Phoenix.Controller + import Plug.Conn + + def init(default), do: default + + def call(conn, _opts) do + case get_session(conn, :railway_token) do + nil -> + conn + |> Controller.put_flash(:error, "You need a railway token") + |> Controller.redirect(to: "/") + token -> + p = + case Projects.get_project_by_token(token) do + nil -> Projects.create_project(token) + p -> p + end + + conn + |> put_session(:project_id, p) + end + end +end diff --git a/lib/ezcontainer_railway_web/router.ex b/lib/ezcontainer_railway_web/router.ex index 16e80e6..2585ef7 100644 --- a/lib/ezcontainer_railway_web/router.ex +++ b/lib/ezcontainer_railway_web/router.ex @@ -4,7 +4,7 @@ defmodule EzcontainerRailwayWeb.Router do pipeline :browser do plug :accepts, ["html"] plug :fetch_session - #plug EzcontainerRailwayWeb.AnonSession + plug EzcontainerRailwayWeb.AnonSession plug :fetch_live_flash plug :put_root_layout, html: {EzcontainerRailwayWeb.Layouts, :root} plug :protect_from_forgery @@ -15,11 +15,20 @@ defmodule EzcontainerRailwayWeb.Router do plug :accepts, ["json"] end + pipeline :ensure_token do + plug EzcontainerRailwayWeb.RailwayCheck + end + scope "/", EzcontainerRailwayWeb do pipe_through :browser get "/", PageController, :home post "/token", SessionController, :token + end + + scope "/", EzcontainerRailwayWeb do + pipe_through :browser + pipe_through :ensure_token live "/containers", ContainerCreateLive resources("/containers", ContainerController, only: [:create, :show])