<%= get_flash(@conn, :info) %>
-<%= get_flash(@conn, :error) %>
++
diff --git a/apps/cf_http/assets/css/app.css b/apps/cf_http/assets/css/app.css index fec0b3fc8..9313f4354 100644 --- a/apps/cf_http/assets/css/app.css +++ b/apps/cf_http/assets/css/app.css @@ -1,3 +1,3 @@ /* This file is for your main application css. */ -@import "./phoenix.css"; +@import "./main.css"; diff --git a/apps/cf_http/assets/css/main.css b/apps/cf_http/assets/css/main.css new file mode 100644 index 000000000..e69de29bb diff --git a/apps/cf_http/assets/css/phoenix.css b/apps/cf_http/assets/css/phoenix.css deleted file mode 100644 index 8d1d79c27..000000000 --- a/apps/cf_http/assets/css/phoenix.css +++ /dev/null @@ -1,135 +0,0 @@ -/* Includes some default style for the starter application. - * This can be safely deleted to start fresh. - */ - -/* Milligram v1.3.0 https://milligram.github.io - * Copyright (c) 2017 CJ Patoilo Licensed under the MIT license - */ - -*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#000000;font-family:'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#0069d9;border:0.1rem solid #0069d9;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#0069d9;border-color:#0069d9}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#0069d9}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#0069d9}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#0069d9}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#0069d9}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #0069d9;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem;width:100%}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#0069d9;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{-ms-grid-row-align:center;align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#0069d9;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right} - -/* General style */ -h1{font-size: 3.6rem; line-height: 1.25} -h2{font-size: 2.8rem; line-height: 1.3} -h3{font-size: 2.2rem; letter-spacing: -.08rem; line-height: 1.35} -h4{font-size: 1.8rem; letter-spacing: -.05rem; line-height: 1.5} -h5{font-size: 1.6rem; letter-spacing: 0; line-height: 1.4} -h6{font-size: 1.4rem; letter-spacing: 0; line-height: 1.2} - -.container{ - margin: 0 auto; - max-width: 80.0rem; - padding: 0 2.0rem; - position: relative; - width: 100% -} -select { - width: auto; -} - -/* Alerts and form errors */ -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert p { - margin-bottom: 0; -} -.alert:empty { - display: none; -} -.help-block { - color: #a94442; - display: block; - margin: -1rem 0 2rem; -} - -/* FireGuard promo and logo */ -.cf-hero { - text-align: center; - border-bottom: 1px solid #e3e3e3; - background: #eee; - border-radius: 6px; - padding: 3em; - margin-bottom: 3rem; - font-weight: 200; - font-size: 120%; -} -.cf-hero p { - margin: 0; -} -.cf-logo { - min-width: 300px; - margin: 1rem; - display: block; -} - -.cf-logo img { - width: auto; - display: block; -} - -/* Headers */ -header { - width: 100%; - background: #fdfdfd; - border-bottom: 1px solid #eaeaea; - margin-bottom: 2rem; -} -header section { - align-items: center; - display: flex; - flex-direction: column; - justify-content: space-between; -} -header section :first-child { - order: 2; -} -header section :last-child { - order: 1; -} -header nav ul, -header nav li { - margin: 0; - padding: 0; - display: block; - text-align: right; - white-space: nowrap; -} -header nav ul { - margin: 1rem; - margin-top: 0; -} -header nav a { - display: block; -} - -@media (min-width: 40.0rem) { /* Small devices (landscape phones, 576px and up) */ - header section { - flex-direction: row; - } - header nav ul { - margin: 1rem; - } - .cf-logo { - flex-basis: 527px; - margin: 0 1rem; - } -} diff --git a/apps/cf_http/assets/static/images/logo.svg b/apps/cf_http/assets/static/images/logo.svg deleted file mode 100644 index 73ba08fad..000000000 --- a/apps/cf_http/assets/static/images/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/apps/cf_http/lib/cf_http/devices/device.ex b/apps/cf_http/lib/cf_http/devices/device.ex index 8e4d8e242..b83740905 100644 --- a/apps/cf_http/lib/cf_http/devices/device.ex +++ b/apps/cf_http/lib/cf_http/devices/device.ex @@ -12,7 +12,7 @@ defmodule CfHttp.Devices.Device do field :verified_at, :utc_datetime field :user_id, :id - has_many :firewall_rules, CfHttp.FirewallRules.FirewallRule + has_many :rules, CfHttp.Rules.Rule timestamps() end diff --git a/apps/cf_http/lib/cf_http/firewall_rules.ex b/apps/cf_http/lib/cf_http/firewall_rules.ex deleted file mode 100644 index 7be333dd1..000000000 --- a/apps/cf_http/lib/cf_http/firewall_rules.ex +++ /dev/null @@ -1,104 +0,0 @@ -defmodule CfHttp.FirewallRules do - @moduledoc """ - The FirewallRules context. - """ - - import Ecto.Query, warn: false - alias CfHttp.Repo - - alias CfHttp.FirewallRules.FirewallRule - - @doc """ - Returns the list of firewall_rules. - - ## Examples - - iex> list_firewall_rules() - [%FirewallRule{}, ...] - - """ - def list_firewall_rules do - Repo.all(FirewallRule) - end - - @doc """ - Gets a single firewall_rule. - - Raises `Ecto.NoResultsError` if the Firewall rule does not exist. - - ## Examples - - iex> get_firewall_rule!(123) - %FirewallRule{} - - iex> get_firewall_rule!(456) - ** (Ecto.NoResultsError) - - """ - def get_firewall_rule!(id), do: Repo.get!(FirewallRule, id) - - @doc """ - Creates a firewall_rule. - - ## Examples - - iex> create_firewall_rule(%{field: value}) - {:ok, %FirewallRule{}} - - iex> create_firewall_rule(%{field: bad_value}) - {:error, %Ecto.Changeset{}} - - """ - def create_firewall_rule(attrs \\ %{}) do - %FirewallRule{} - |> FirewallRule.changeset(attrs) - |> Repo.insert() - end - - @doc """ - Updates a firewall_rule. - - ## Examples - - iex> update_firewall_rule(firewall_rule, %{field: new_value}) - {:ok, %FirewallRule{}} - - iex> update_firewall_rule(firewall_rule, %{field: bad_value}) - {:error, %Ecto.Changeset{}} - - """ - def update_firewall_rule(%FirewallRule{} = firewall_rule, attrs) do - firewall_rule - |> FirewallRule.changeset(attrs) - |> Repo.update() - end - - @doc """ - Deletes a firewall_rule. - - ## Examples - - iex> delete_firewall_rule(firewall_rule) - {:ok, %FirewallRule{}} - - iex> delete_firewall_rule(firewall_rule) - {:error, %Ecto.Changeset{}} - - """ - def delete_firewall_rule(%FirewallRule{} = firewall_rule) do - Repo.delete(firewall_rule) - end - - @doc """ - Returns an `%Ecto.Changeset{}` for tracking firewall_rule changes. - - ## Examples - - iex> change_firewall_rule(firewall_rule) - %Ecto.Changeset{source: %FirewallRule{}} - - """ - def change_firewall_rule(%FirewallRule{} = firewall_rule) do - FirewallRule.changeset(firewall_rule, %{}) - end -end diff --git a/apps/cf_http/lib/cf_http/rules.ex b/apps/cf_http/lib/cf_http/rules.ex new file mode 100644 index 000000000..6696f0776 --- /dev/null +++ b/apps/cf_http/lib/cf_http/rules.ex @@ -0,0 +1,104 @@ +defmodule CfHttp.Rules do + @moduledoc """ + The Rules context. + """ + + import Ecto.Query, warn: false + alias CfHttp.Repo + + alias CfHttp.Rules.Rule + + @doc """ + Returns the list of rules. + + ## Examples + + iex> list_rules() + [%Rule{}, ...] + + """ + def list_rules do + Repo.all(Rule) + end + + @doc """ + Gets a single rule. + + Raises `Ecto.NoResultsError` if the Rule does not exist. + + ## Examples + + iex> get_rule!(123) + %Rule{} + + iex> get_rule!(456) + ** (Ecto.NoResultsError) + + """ + def get_rule!(id), do: Repo.get!(Rule, id) + + @doc """ + Creates a rule. + + ## Examples + + iex> create_rule(%{field: value}) + {:ok, %Rule{}} + + iex> create_rule(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_rule(attrs \\ %{}) do + %Rule{} + |> Rule.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a rule. + + ## Examples + + iex> update_rule(rule, %{field: new_value}) + {:ok, %Rule{}} + + iex> update_rule(rule, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_rule(%Rule{} = rule, attrs) do + rule + |> Rule.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a rule. + + ## Examples + + iex> delete_rule(rule) + {:ok, %Rule{}} + + iex> delete_rule(rule) + {:error, %Ecto.Changeset{}} + + """ + def delete_rule(%Rule{} = rule) do + Repo.delete(rule) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking rule changes. + + ## Examples + + iex> change_rule(rule) + %Ecto.Changeset{source: %Rule{}} + + """ + def change_rule(%Rule{} = rule) do + Rule.changeset(rule, %{}) + end +end diff --git a/apps/cf_http/lib/cf_http/firewall_rules/firewall_rule.ex b/apps/cf_http/lib/cf_http/rules/rule.ex similarity index 78% rename from apps/cf_http/lib/cf_http/firewall_rules/firewall_rule.ex rename to apps/cf_http/lib/cf_http/rules/rule.ex index b134879ba..254512913 100644 --- a/apps/cf_http/lib/cf_http/firewall_rules/firewall_rule.ex +++ b/apps/cf_http/lib/cf_http/rules/rule.ex @@ -1,4 +1,4 @@ -defmodule CfHttp.FirewallRules.FirewallRule do +defmodule CfHttp.Rules.Rule do @moduledoc """ Not really sure what to write here. I'll update this later. """ @@ -6,7 +6,7 @@ defmodule CfHttp.FirewallRules.FirewallRule do use Ecto.Schema import Ecto.Changeset - schema "firewall_rules" do + schema "rules" do field :destination, :string field :enabled, :boolean, default: false field :port, :string @@ -18,8 +18,8 @@ defmodule CfHttp.FirewallRules.FirewallRule do end @doc false - def changeset(firewall_rule, attrs) do - firewall_rule + def changeset(rule, attrs) do + rule |> cast(attrs, [:destination, :port, :protocol, :enabled]) |> validate_required([:destination, :port, :protocol, :enabled]) end diff --git a/apps/cf_http/lib/cf_http/sessions.ex b/apps/cf_http/lib/cf_http/sessions.ex new file mode 100644 index 000000000..ae2e9ce8e --- /dev/null +++ b/apps/cf_http/lib/cf_http/sessions.ex @@ -0,0 +1,105 @@ +defmodule CfHttp.Sessions do + @moduledoc """ + The Sessions context. + """ + + import Ecto.Query, warn: false + alias CfHttp.Repo + + alias CfHttp.Sessions.Session + + @doc """ + Returns the list of sessions. + + ## Examples + + iex> list_sessions() + [%Session{}, ...] + + """ + def list_sessions do + Repo.all(Session) + end + + @doc """ + Gets a single session. + + Raises `Ecto.NoResultsError` if the Session does not exist. + + ## Examples + + iex> get_session!(123) + %Session{} + + iex> get_session!(456) + ** (Ecto.NoResultsError) + + """ + def get_session!(id), do: Repo.get!(Session, id) + + @doc """ + Creates a session. + + ## Examples + + iex> create_session(%{field: value}) + {:ok, %Session{}} + + iex> create_session(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_session(attrs \\ %{}) do + %Session{} + |> Session.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a session. + + ## Examples + + iex> update_session(session, %{field: new_value}) + {:ok, %Session{}} + + iex> update_session(session, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_session(%Session{} = session, attrs) do + session + |> Session.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a session. + + ## Examples + + iex> delete_session(session) + {:ok, %Session{}} + + iex> delete_session(session) + {:error, %Ecto.Changeset{}} + + """ + def delete_session(%Session{} = session) do + Repo.delete(session) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking session changes. + + ## Examples + + iex> change_session(session) + %Ecto.Changeset{source: %Session{}} + + """ + def change_session(%Session{} = session) do + Session.changeset(session, %{}) + end +end + diff --git a/apps/cf_http/lib/cf_http/sessions/session.ex b/apps/cf_http/lib/cf_http/sessions/session.ex new file mode 100644 index 000000000..30b1a7842 --- /dev/null +++ b/apps/cf_http/lib/cf_http/sessions/session.ex @@ -0,0 +1,21 @@ +defmodule CfHttp.Sessions.Session do + @moduledoc """ + Represents a Session + """ + + use Ecto.Schema + import Ecto.Changeset + + schema "sessions" do + field :user_id, :id + + timestamps() + end + + @doc false + def changeset(session, attrs \\ %{}) do + session + |> cast(attrs, []) + |> validate_required([]) + end +end diff --git a/apps/cf_http/lib/cf_http/users.ex b/apps/cf_http/lib/cf_http/users.ex new file mode 100644 index 000000000..102f806dc --- /dev/null +++ b/apps/cf_http/lib/cf_http/users.ex @@ -0,0 +1,106 @@ +defmodule CfHttp.Users do + @moduledoc """ + The Users context. + """ + + import Ecto.Query, warn: false + alias CfHttp.Repo + + alias CfHttp.Users.User + + @doc """ + Returns the list of users. + + ## Examples + + iex> list_users() + [%User{}, ...] + + """ + def list_users do + Repo.all(User) + end + + @doc """ + Gets a single user. + + Raises `Ecto.NoResultsError` if the User does not exist. + + ## Examples + + iex> get_user!(123) + %User{} + + iex> get_user!(456) + ** (Ecto.NoResultsError) + + """ + def get_user!(id), do: Repo.get!(User, id) + + @doc """ + Creates a user. + + ## Examples + + iex> create_user(%{field: value}) + {:ok, %User{}} + + iex> create_user(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_user(attrs \\ %{}) do + %User{} + |> User.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a user. + + ## Examples + + iex> update_user(user, %{field: new_value}) + {:ok, %User{}} + + iex> update_user(user, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_user(%User{} = user, attrs) do + user + |> User.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a user. + + ## Examples + + iex> delete_user(user) + {:ok, %User{}} + + iex> delete_user(user) + {:error, %Ecto.Changeset{}} + + """ + def delete_user(%User{} = user) do + Repo.delete(user) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking user changes. + + ## Examples + + iex> change_user(user) + %Ecto.Changeset{source: %User{}} + + """ + def change_user(%User{} = user) do + User.changeset(user, %{}) + end +end + + diff --git a/apps/cf_http/lib/cf_http/user.ex b/apps/cf_http/lib/cf_http/users/user.ex similarity index 94% rename from apps/cf_http/lib/cf_http/user.ex rename to apps/cf_http/lib/cf_http/users/user.ex index 16fdb6011..5b34bc16d 100644 --- a/apps/cf_http/lib/cf_http/user.ex +++ b/apps/cf_http/lib/cf_http/users/user.ex @@ -1,4 +1,4 @@ -defmodule CfHttp.User do +defmodule CfHttp.Users.User do @moduledoc """ Represents a User I guess """ diff --git a/apps/cf_http/lib/cf_http_web/controllers/device_controller.ex b/apps/cf_http/lib/cf_http_web/controllers/device_controller.ex index 69089af50..28ed56f17 100644 --- a/apps/cf_http/lib/cf_http_web/controllers/device_controller.ex +++ b/apps/cf_http/lib/cf_http_web/controllers/device_controller.ex @@ -1,8 +1,10 @@ defmodule CfHttpWeb.DeviceController do - use CfHttpWeb, :controller + @moduledoc """ + Implements the CRUD for a Device + """ - alias CfHttp.Devices - alias CfHttp.Devices.Device + use CfHttpWeb, :controller + alias CfHttp.{Devices, Devices.Device} plug CfHttpWeb.Plugs.Authenticator diff --git a/apps/cf_http/lib/cf_http_web/controllers/firewall_rule_controller.ex b/apps/cf_http/lib/cf_http_web/controllers/firewall_rule_controller.ex deleted file mode 100644 index 17884adae..000000000 --- a/apps/cf_http/lib/cf_http_web/controllers/firewall_rule_controller.ex +++ /dev/null @@ -1,72 +0,0 @@ -defmodule CfHttpWeb.FirewallRuleController do - @moduledoc """ - Controller logic for FirewallRules - """ - - use CfHttpWeb, :controller - - alias CfHttp.Devices - alias CfHttp.FirewallRules - alias CfHttp.FirewallRules.FirewallRule - - plug CfHttpWeb.Plugs.Authenticator - - def index(conn, %{"device_id" => device_id}) do - device = Devices.get_device!(device_id) - - render(conn, "index.html", device: device, firewall_rules: device.firewall_rules) - end - - def new(conn, %{"device_id" => device_id}) do - device = Devices.get_device!(device_id) - - changeset = FirewallRules.change_firewall_rule(%FirewallRule{device_id: device_id}) - render(conn, "new.html", changeset: changeset, device: device) - end - - def create(conn, %{"firewall_rule" => firewall_rule_params}) do - case FirewallRules.create_firewall_rule(firewall_rule_params) do - {:ok, firewall_rule} -> - conn - |> put_flash(:info, "Firewall rule created successfully.") - |> redirect(to: Routes.firewall_rule_path(conn, :show, firewall_rule)) - - {:error, %Ecto.Changeset{} = changeset} -> - render(conn, "new.html", changeset: changeset) - end - end - - def show(conn, %{"id" => id}) do - firewall_rule = FirewallRules.get_firewall_rule!(id) - render(conn, "show.html", firewall_rule: firewall_rule) - end - - def edit(conn, %{"id" => id}) do - firewall_rule = FirewallRules.get_firewall_rule!(id) - changeset = FirewallRules.change_firewall_rule(firewall_rule) - render(conn, "edit.html", firewall_rule: firewall_rule, changeset: changeset) - end - - def update(conn, %{"id" => id, "firewall_rule" => firewall_rule_params}) do - firewall_rule = FirewallRules.get_firewall_rule!(id) - - case FirewallRules.update_firewall_rule(firewall_rule, firewall_rule_params) do - {:ok, firewall_rule} -> - conn - |> put_flash(:info, "Firewall rule updated successfully.") - |> redirect(to: Routes.firewall_rule_path(conn, :show, firewall_rule)) - - {:error, %Ecto.Changeset{} = changeset} -> - render(conn, "edit.html", firewall_rule: firewall_rule, changeset: changeset) - end - end - - def delete(conn, %{"id" => id}) do - firewall_rule = FirewallRules.get_firewall_rule!(id) - {:ok, _firewall_rule} = FirewallRules.delete_firewall_rule(firewall_rule) - - conn - |> put_flash(:info, "Firewall rule deleted successfully.") - |> redirect(to: Routes.firewall_rule_path(conn, :index, firewall_rule.device)) - end -end diff --git a/apps/cf_http/lib/cf_http_web/controllers/page_controller.ex b/apps/cf_http/lib/cf_http_web/controllers/page_controller.ex deleted file mode 100644 index e122f634b..000000000 --- a/apps/cf_http/lib/cf_http_web/controllers/page_controller.ex +++ /dev/null @@ -1,7 +0,0 @@ -defmodule CfHttpWeb.PageController do - use CfHttpWeb, :controller - - def index(conn, _params) do - render(conn, "index.html") - end -end diff --git a/apps/cf_http/lib/cf_http_web/controllers/rule_controller.ex b/apps/cf_http/lib/cf_http_web/controllers/rule_controller.ex new file mode 100644 index 000000000..0cdd740a7 --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/controllers/rule_controller.ex @@ -0,0 +1,70 @@ +defmodule CfHttpWeb.RuleController do + @moduledoc """ + Controller logic for Rules + """ + + use CfHttpWeb, :controller + alias CfHttp.{Devices, Rules, Rules.Rule} + + plug CfHttpWeb.Plugs.Authenticator + + def index(conn, %{"device_id" => device_id}) do + device = Devices.get_device!(device_id) + + render(conn, "index.html", device: device, rules: device.rules) + end + + def new(conn, %{"device_id" => device_id}) do + device = Devices.get_device!(device_id) + + changeset = Rules.change_rule(%Rule{device_id: device_id}) + render(conn, "new.html", changeset: changeset, device: device) + end + + def create(conn, %{"rule" => rule_params}) do + case Rules.create_rule(rule_params) do + {:ok, rule} -> + conn + |> put_flash(:info, "Rule created successfully.") + |> redirect(to: Routes.rule_path(conn, :show, rule)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "new.html", changeset: changeset) + end + end + + def show(conn, %{"id" => id}) do + rule = Rules.get_rule!(id) + render(conn, "show.html", rule: rule) + end + + def edit(conn, %{"id" => id}) do + rule = Rules.get_rule!(id) + changeset = Rules.change_rule(rule) + + render(conn, "edit.html", rule: rule, changeset: changeset) + end + + def update(conn, %{"id" => id, "rule" => rule_params}) do + rule = Rules.get_rule!(id) + + case Rules.update_rule(rule, rule_params) do + {:ok, rule} -> + conn + |> put_flash(:info, "Rule updated successfully.") + |> redirect(to: Routes.rule_path(conn, :show, rule)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "edit.html", rule: rule, changeset: changeset) + end + end + + def delete(conn, %{"id" => id}) do + rule = Rules.get_rule!(id) + {:ok, _rule} = Rules.delete_rule(rule) + + conn + |> put_flash(:info, "Rule deleted successfully.") + |> redirect(to: Routes.rule_path(conn, :index, rule.device)) + end +end diff --git a/apps/cf_http/lib/cf_http_web/controllers/session_controller.ex b/apps/cf_http/lib/cf_http_web/controllers/session_controller.ex new file mode 100644 index 000000000..594b3ca26 --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/controllers/session_controller.ex @@ -0,0 +1,59 @@ +defmodule CfHttpWeb.SessionController do + @moduledoc """ + Implements the CRUD for a Session + """ + + use CfHttpWeb, :controller + alias CfHttp.{Repo, Users.User, Sessions, Sessions.Session} + + plug :redirect_authenticated when action in [:new] + plug CfHttpWeb.Plugs.Authenticator when action in [:delete] + + # GET /sessions/new + def new(conn, _params) do + changeset = Session.changeset(%Session{}) + + render(conn, "new.html", changeset: changeset) + end + + # Sign In + # POST /sessions + def create(conn, params) do + changeset = Session.changeset(%Session{}, params) + + case Repo.insert(changeset) do + {:ok, session} -> + conn + |> assign(:current_session, session) + |> put_flash(:info, "Session created successfully") + |> redirect(to: Routes.device_path(conn, :index)) + + {:error, changeset} -> + conn + |> put_flash(:error, "Error creating session.") + |> render("new.html", changeset: changeset) + end + end + + # Sign Out + # DELETE /session + def delete(conn, _params) do + case Repo.delete(conn.current_session) do + {:ok, _session} -> + conn + |> assign(:current_session, nil) + |> put_flash(:info, "Session deleted successfully.") + |> redirect(to: "/") + end + end + + defp redirect_authenticated(conn, _) do + user = %User{id: 1, email: "dev_user@fireguard.network"} + session = %Session{user_id: user.id} + + conn + |> assign(:current_session, session) + |> redirect(to: "/") + |> halt() + end +end diff --git a/apps/cf_http/lib/cf_http_web/controllers/user_controller.ex b/apps/cf_http/lib/cf_http_web/controllers/user_controller.ex index 2ee715eb5..0baf01dc3 100644 --- a/apps/cf_http/lib/cf_http_web/controllers/user_controller.ex +++ b/apps/cf_http/lib/cf_http_web/controllers/user_controller.ex @@ -4,30 +4,26 @@ defmodule CfHttpWeb.UserController do """ use CfHttpWeb, :controller - alias CfHttp.{Repo, User} + alias CfHttp.{Repo, Users, Users.User} plug CfHttpWeb.Plugs.Authenticator when action in [:show, :edit, :update, :delete] # GET /users/new def new(conn, _params) do - changeset = User.changeset(%User{}) - - conn - |> render("new.html", changeset: changeset) + changeset = Users.change_user(%User{}) + render(conn, "new.html", changeset: changeset) end # POST /users - def create(conn, params) do - changeset = User.changeset(%User{}, params) - - case Repo.insert(changeset) do + def create(conn, %{"user" => user_params}) do + case Users.create_user(conn, user_params) do {:ok, user} -> conn |> assign(:current_user, user) - |> put_flash(:info, "User created successfully") + |> put_flash(:info, "User created successfully.") |> redirect(to: Routes.device_path(conn, :index)) - {:error, changeset} -> + {:error, %Ecto.Changeset{} = changeset} -> conn |> put_flash(:error, "Error creating user.") |> render("new.html", changeset: changeset) @@ -36,10 +32,10 @@ defmodule CfHttpWeb.UserController do # GET /user/edit def edit(conn, _params) do - changeset = User.changeset(conn.current_user) + user = conn.current_user + changeset = Users.change_user(user) - conn - |> render("edit.html", changeset: changeset) + render(conn, "edit.html", changeset: changeset) end # GET /user @@ -73,7 +69,7 @@ defmodule CfHttpWeb.UserController do conn |> assign(:current_user, nil) |> put_flash(:info, "User deleted successfully.") - |> redirect(to: Routes.page_path(conn, :index)) + |> redirect(to: "/") {:error, _changeset} -> conn diff --git a/apps/cf_http/lib/cf_http_web/plugs/authenticator.ex b/apps/cf_http/lib/cf_http_web/plugs/authenticator.ex index 19c661615..194cfa50b 100644 --- a/apps/cf_http/lib/cf_http_web/plugs/authenticator.ex +++ b/apps/cf_http/lib/cf_http_web/plugs/authenticator.ex @@ -4,7 +4,7 @@ defmodule CfHttpWeb.Plugs.Authenticator do """ import Plug.Conn - alias CfHttp.User + alias CfHttp.Users.User def init(default), do: default diff --git a/apps/cf_http/lib/cf_http_web/router.ex b/apps/cf_http/lib/cf_http_web/router.ex index 84a8d6f22..5e6cea2e9 100644 --- a/apps/cf_http/lib/cf_http_web/router.ex +++ b/apps/cf_http/lib/cf_http_web/router.ex @@ -1,4 +1,8 @@ defmodule CfHttpWeb.Router do + @moduledoc """ + Main Application Router + """ + use CfHttpWeb, :router pipeline :browser do @@ -16,16 +20,18 @@ defmodule CfHttpWeb.Router do scope "/", CfHttpWeb do pipe_through :browser - get "/", PageController, :index - resources "/user", UserController, singleton: true, only: [:show, :edit, :update, :delete] resources "/users", UserController, only: [:new, :create] resources "/devices", DeviceController, except: [:create] do - resources "/firewall_rules", FirewallRuleController, only: [:new, :index, :create] + resources "/rules", RuleController, only: [:new, :index, :create] end - resources "/firewall_rules", FirewallRuleController, only: [:show, :update, :delete, :edit] + resources "/rules", RuleController, only: [:show, :update, :delete, :edit] + + resources "/sessions", SessionController, only: [:new, :create, :delete] + + get "/", DeviceController, :index end # Other scopes may use custom stacks. diff --git a/apps/cf_http/lib/cf_http_web/templates/device/form.html.eex b/apps/cf_http/lib/cf_http_web/templates/device/form.html.eex index e43e401a1..2cd1a0abe 100644 --- a/apps/cf_http/lib/cf_http_web/templates/device/form.html.eex +++ b/apps/cf_http/lib/cf_http_web/templates/device/form.html.eex @@ -1,6 +1,6 @@ <%= form_for @changeset, @action, fn f -> %> <%= if @changeset.action do %> -
Oops, something went wrong! Please check the errors below.
| Destination | -Port | -Protocol | -Enabled | - -- |
|---|---|---|---|---|
| <%= firewall_rule.destination %> | -<%= firewall_rule.port %> | -<%= firewall_rule.protocol %> | -<%= firewall_rule.enabled %> | - -- <%= link "Show", to: Routes.firewall_rule_path(@conn, :show, firewall_rule) %> - <%= link "Edit", to: Routes.firewall_rule_path(@conn, :edit, firewall_rule) %> - <%= link "Delete", to: Routes.firewall_rule_path(@conn, :delete, firewall_rule), method: :delete, data: [confirm: "Are you sure?"] %> - | -
<%= get_flash(@conn, :info) %>
-<%= get_flash(@conn, :error) %>
+