more changes

This commit is contained in:
benbot 2023-10-25 04:48:36 -04:00
parent beaf92f7c4
commit a3a4af7965
18 changed files with 165 additions and 24 deletions

View file

@ -1,5 +1,5 @@
[ [
import_deps: [:phoenix], import_deps: [:ecto, :ecto_sql, :phoenix],
subdirectories: ["priv/*/migrations"], subdirectories: ["priv/*/migrations"],
plugins: [Phoenix.LiveView.HTMLFormatter], plugins: [Phoenix.LiveView.HTMLFormatter],
inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"] inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"]

1
.gitignore vendored
View file

@ -35,3 +35,4 @@ ezcontainer_railway-*.tar
npm-debug.log npm-debug.log
/assets/node_modules/ /assets/node_modules/
db

View file

@ -11,6 +11,10 @@ config :ezcontainer_railway,
ecto_repos: [EzcontainerRailway.Repo], ecto_repos: [EzcontainerRailway.Repo],
generators: [timestamp_type: :utc_datetime] generators: [timestamp_type: :utc_datetime]
# Configure your database
config :ezcontainer_railway, EzcontainerRailway.Repo,
database: "./db/db.sqlite3"
# Configures the endpoint # Configures the endpoint
config :ezcontainer_railway, EzcontainerRailwayWeb.Endpoint, config :ezcontainer_railway, EzcontainerRailwayWeb.Endpoint,
url: [host: "localhost"], url: [host: "localhost"],

View file

@ -2,13 +2,7 @@ import Config
# Configure your database # Configure your database
config :ezcontainer_railway, EzcontainerRailway.Repo, config :ezcontainer_railway, EzcontainerRailway.Repo,
username: "postgres", database: "./db/db.sqlite3"
password: "postgres",
hostname: "localhost",
database: "ezcontainer_railway_dev",
stacktrace: true,
show_sensitive_data_on_connection_error: true,
pool_size: 10
# For development, we disable any cache and enable # For development, we disable any cache and enable
# debugging and code reloading. # debugging and code reloading.

View file

@ -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 case Req.Request.put_headers(Req.new(), [{"Authorization", "Bearer #{opts[:token]}"}]) |> Req.post(url: @graphql_url, json: body) do
{:ok, resp} -> resp {:ok, resp} -> resp
{:error, _} -> :error {:error, e} -> raise(e)
end end
end end
end end

View file

@ -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

View file

@ -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

View file

@ -8,6 +8,7 @@ defmodule EzcontainerRailway.Railway do
edges { edges {
node { node {
id id
name
} }
} }
} }
@ -16,4 +17,53 @@ defmodule EzcontainerRailway.Railway do
token: token token: token
) )
end 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 end

View file

@ -1,2 +1,3 @@
defmodule EzcontainerRailway.Repo do defmodule EzcontainerRailway.Repo do
use Ecto.Repo, otp_app: :ezcontainer_railway, adapter: Ecto.Adapters.SQLite3
end end

View file

@ -1 +0,0 @@
benbot@darch.125027:1698169376

View file

@ -11,7 +11,7 @@ defmodule EzcontainerRailwayWeb.ContainerController do
end end
def create(conn, params) do def create(conn, params) do
conn
end end
def show(conn, params) do def show(conn, params) do

View file

@ -1,30 +1,29 @@
defmodule EzcontainerRailwayWeb.SessionController do defmodule EzcontainerRailwayWeb.SessionController do
alias EzcontainerRailway.Railway
use EzcontainerRailwayWeb, :controller use EzcontainerRailwayWeb, :controller
def token(conn, %{"railway_token" => token}) do def token(conn, %{"railway_token" => token}) do
case token_valid?(token) do case get_projects(token) do
true -> resp when is_map(resp) ->
IO.inspect(resp)
conn conn
|> put_session(:railway_token, token) |> put_session(:railway_token, token)
|> assign(:railway_token, token) |> assign(:railway_token, token)
|> redirect(to: "/containers") |> redirect(to: "/containers")
false -> nil ->
conn conn
|> put_flash(:error, "Invalid Token") |> put_flash(:error, "Invalid Token")
|> redirect(to: "/") |> redirect(to: "/")
end end
end end
defp token_valid?(token) do defp get_projects(token) do
resp = EzcontainerRailway.Railway.get_projects(token).body resp = EzcontainerRailway.Railway.get_projects(token).body
if has_errors?(resp["errors"]) do if Railway.has_errors?(resp) do
false nil
else else
true resp["data"]
end end
end end
defp has_errors?([_|_]), do: true
defp has_errors?(_), do: false
end end

View file

@ -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) %>
<dialog open class="modal">
<article class="modal-box">
<.form
for={@form}
method="post"
action="/container"
>
<label class="label">
<span class="label-text">Container Name</span>
<span class="label-text-alt mr-20">Tag</span>
</label>
<div class="grid grid-rows-1 grid-cols-4 gap-4">
<input class="input input-bordered inline col-span-3" name="container_name" />
<input class="input input-bordered inline" name="container_tag" />
</div>
<div class="text-center mt-6">
<button class="btn">Test</button>
</div>
</.form>
</article>
</dialog>
"""
end
def mount(_params, _session, socket) do
form = Component.to_form(%{"container_name" => "", "contianer_tag" => ""})
{:ok, socket |> assign(:form, form)}
end
end

View file

@ -21,7 +21,8 @@ defmodule EzcontainerRailwayWeb.Router do
get "/", PageController, :home get "/", PageController, :home
post "/token", SessionController, :token post "/token", SessionController, :token
resources("/containers", ContainerController, only: [:index, :create, :show]) live "/containers", ContainerCreateLive
resources("/containers", ContainerController, only: [:create, :show])
end end
# Other scopes may use custom stacks. # Other scopes may use custom stacks.

View file

@ -36,6 +36,9 @@ defmodule EzcontainerRailway.MixProject do
{:phoenix_html, "~> 3.3"}, {:phoenix_html, "~> 3.3"},
{:phoenix_live_reload, "~> 1.2", only: :dev}, {:phoenix_live_reload, "~> 1.2", only: :dev},
{:phoenix_live_view, "~> 0.20.1"}, {:phoenix_live_view, "~> 0.20.1"},
{:phoenix_ecto, "~> 4.4"},
{:ecto_sql, "~> 3.10"},
{:ecto_sqlite3, "~> 0.12"},
{:floki, ">= 0.30.0", only: :test}, {:floki, ">= 0.30.0", only: :test},
{:phoenix_live_dashboard, "~> 0.8.2"}, {:phoenix_live_dashboard, "~> 0.8.2"},
{:esbuild, "~> 0.7", runtime: Mix.env() == :dev}, {: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. # See the documentation for `Mix` for more info on aliases.
defp aliases do defp aliases do
[ [
setup: ["deps.get", "assets.setup", "assets.build"], setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"],
test: ["test"], "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.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
"assets.build": ["tailwind default", "esbuild default"], "assets.build": ["tailwind default", "esbuild default"],
"assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"] "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"]

View file

@ -1,5 +1,6 @@
%{ %{
"castore": {:hex, :castore, "1.0.4", "ff4d0fb2e6411c0479b1d965a814ea6d00e51eb2f58697446e9c41a97d940b28", [:mix], [], "hexpm", "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8"}, "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": {: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"}, "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"}, "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"}, "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": {: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_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"}, "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"}, "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"}, "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"}, "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"}, "floki": {:hex, :floki, "0.35.1", "b21cf592ed38c1207c5ea52120a2e81d6ecba11337a633a3f29ec17a64033178", [:mix], [], "hexpm", "f126e3eb814f131c21befeeeb773d2c4e2331ce05214c1a9844a3edde5c69003"},

View file

@ -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