Start pipeline UI

This commit is contained in:
Shadowfacts 2019-07-20 19:08:56 -04:00
parent 0a1909dbc4
commit 7f3ff17925
Signed by: shadowfacts
GPG Key ID: 94A5AB95422746E5
7 changed files with 195 additions and 28 deletions

View File

@ -53,9 +53,13 @@ defmodule FrenzyWeb.FeedController do
end
def edit(conn, _params) do
feed = conn.assigns[:feed] |> Repo.preload(:filter)
changeset = Feed.changeset(feed, %{})
render(conn, "edit.html", changeset: changeset)
feed = conn.assigns[:feed] |> Repo.preload([:filter, :pipeline_stages])
stages = Enum.sort_by(feed.pipeline_stages, fn stage -> stage.index end)
render(conn, "edit.html", %{
feed: feed,
stages: stages
})
end
def update(conn, %{"feed" => feed_params}) do

View File

@ -0,0 +1,114 @@
defmodule FrenzyWeb.PipelineController do
use FrenzyWeb, :controller
alias Frenzy.{Repo, Feed, PipelineStage}
alias FrenzyWeb.Router.Helpers, as: Routes
alias FrenzyWeb.Endpoint
import Ecto.Query
plug :user_owns_feed
plug :user_owns_stage
defp user_owns_feed(%Plug.Conn{path_params: %{"feed_id" => feed_id}} = conn, _opts) do
user = conn.assigns[:user]
feed = Repo.get(Feed, feed_id) |> Repo.preload(:pipeline_stages)
if Enum.any?(user.groups, fn g -> g.id == feed.group_id end) do
conn
|> assign(:feed, feed)
else
conn
|> put_flash(:error, "You do not have permission to access that resource.")
|> redirect(to: Routes.group_path(Endpoint, :index))
|> halt()
end
end
defp user_owns_feed(conn, _opts), do: conn
defp user_owns_stage(%Plug.Conn{path_params: %{"stage_id" => stage_id}} = conn, _opts) do
feed = conn.assigns[:feed]
stage = Repo.get(PipelineStage, stage_id)
if stage.feed_id == feed.id do
conn
|> assign(:stage, stage)
else
conn
|> put_flash(:error, "You do not have permission to access that resource.")
|> redirect(to: Routes.group_path(Endpoint, :index))
|> halt()
end
end
defp user_owns_stage(conn, _opts), do: conn
def edit(conn, %{"stage_id" => stage_id}) do
feed = conn.assigns[:feed]
stage = conn.assigns[:stage]
{:ok, options_json} = Jason.encode(stage.options, pretty: true)
render(conn, "edit.html", %{
feed: feed,
stage: stage,
options: options_json
})
end
def update(conn, %{"options" => options_json}) do
feed = conn.assigns[:feed]
stage = conn.assigns[:stage]
{:ok, options} = Jason.decode(options_json)
changeset = PipelineStage.changeset(stage, %{options: options})
{:ok, _stage} = Repo.update(changeset)
conn
|> put_flash(:info, "Pipeline Stage updated")
|> redirect(to: Routes.feed_path(Endpoint, :edit, feed.id))
end
def new(conn, _params) do
changeset = PipelineStage.changeset(%PipelineStage{}, %{})
render(conn, "new.html", %{
feed: conn.assigns[:feed],
changeset: changeset
})
end
def create(conn, %{
"pipeline_stage" => %{
"index" => index,
"module_name" => module_name,
"options" => options_json
}
}) do
feed = conn.assigns[:feed]
{index, _} = Integer.parse(index)
{:ok, options} = Jason.decode(options_json)
changeset =
Ecto.build_assoc(feed, :pipeline_stages, %{
index: index,
module_name: module_name,
options: options
})
{:ok, _stage} = Repo.insert(changeset)
conn
|> put_flash(:info, "Pipeline Stage created")
|> redirect(to: Routes.feed_path(Endpoint, :edit, feed.id))
end
def delete(conn, _params) do
feed = conn.assigns[:feed]
stage = conn.assigns[:stage]
{:ok, _stage} = Repo.delete(stage)
conn
|> put_flash(:info, "Pipeline Stage deleted")
|> redirect(to: Routes.feed_path(Endpoint, :edit, feed.id))
end
end

View File

@ -49,8 +49,14 @@ defmodule FrenzyWeb.Router do
resources "/feeds", FeedController, except: [:index, :new]
post "/feeds/:id/refresh", FeedController, :refresh
#post "/feeds/:id/enable_filter", FeedController, :enable_filter
#post "/feeds/:id/disable_filter", FeedController, :disable_filter
# resources "/pipelines", PipelineController, only: [:edit, :update, :new, :create]
get "/feeds/:feed_id/pipelines/:stage_id/edit", PipelineController, :edit
post "/feeds/:feed_id/pipelines/:stage_id/update", PipelineController, :update
delete "/feeds/:feed_id/pipelines/:stage_id/delete", PipelineController, :delete
get "/feeds/:feed_id/pipelines/new", PipelineController, :new
post "/feeds/:feed_id/pipelines/create", PipelineController, :create
resources "/filters", FilterController, only: [:edit, :update]
post "/filters/:id/add_rule", FilterController, :add_rule

View File

@ -1,25 +1,29 @@
<h2>Feed</h2>
<%= form_tag Routes.filter_path(@conn, :edit, @changeset.data.filter.id), method: :get, class: "d-inline" do %>
<%= submit "Edit Filter", class: "btn btn-secondary" %>
<% end %>
<h2>Feed Pipeline</h2>
<%= form_for @changeset, Routes.feed_path(@conn, :update, @changeset.data.id), fn form -> %>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="filter_enabled">Filter Enabled</label>
<div class="col-sm-9">
<%= checkbox form, :filter_enabled %>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="scrape_remote_content">Scrape Remote Content</label>
<div class="col-sm-9">
<%= checkbox form, :scrape_remote_content %>
</div>
</div>
<div class="form-group row">
<div class="col-sm-10">
<%= submit "Update Feed", class: "btn btn-primary" %>
</div>
</div>
<table class="table table-striped mt-4">
<thead>
<tr>
<th>Module</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for stage <- @stages do %>
<tr>
<td>
<code><%= stage.module_name %></code>
</td>
<td>
<a href="<%= Routes.pipeline_path(@conn, :edit, @feed.id, stage.id) %>" class="btn btn-primary btn-sm">
Edit
</a>
<%= form_for @conn, Routes.pipeline_path(@conn, :delete, @feed.id, stage.id), [method: :delete, style: "display: inline-block;"], fn f -> %>
<%= submit "Delete", class: "btn btn-danger btn-sm" %>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
<a href="<%= Routes.pipeline_path(@conn, :new, @feed.id) %>" class="btn btn-primary">Add Stage</a>

View File

@ -0,0 +1,9 @@
<h2>Pipeline Stage</h2>
<h3>Feed: <%= @feed.title %></h3>
<h3>Module: <code><%= @stage.module_name %></code></h3>
<%= form_for @conn, Routes.pipeline_path(@conn, :update, @feed.id, @stage.id), fn f -> %>
<%= textarea f, :options, value: @options, class: "form-control", rows: 15, style: "font-family: monospace;" %>
<%= submit "Update", class: "btn btn-primary mt-2" %>
<% end %>

View File

@ -0,0 +1,27 @@
<h2>Feed Pipeline</h2>
<%= form_for @changeset, Routes.pipeline_path(@conn, :create, @feed.id), fn f -> %>
<div class="form-group row">
<label class="col-sm-2 col-form-label" for="module_name">Module Name</label>
<div class="col-sm-10">
<%= text_input f, :module_name, placeholder: "Frenzy.Pipeline.FilterStage", class: "form-control" %>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label" for="index">Index</label>
<div class="col-sm-10">
<%= number_input f, :index, value: "#{@feed.pipeline_stages |> Enum.count()}", class: "form-control" %>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 col-form-label" for="options">Options</label>
<div class="col-sm-10">
<%= textarea f, :options, value: "{}", class: "form-control", rows: 15, style: "font-family: monospace;" %>
</div>
</div>
<div class="form-group row">
<div class="col-sm-10">
<%= submit "Create Stage", class: "btn btn-primary" %>
</div>
</div>
<% end %>

View File

@ -0,0 +1,3 @@
defmodule FrenzyWeb.PipelineView do
use FrenzyWeb, :view
end