[WIP] hooked up tasks table with real data

This commit is contained in:
Kieran Eglin 2024-05-16 15:11:58 -07:00
parent 726d236540
commit d662d58dd5
No known key found for this signature in database
GPG key ID: 193984967FCF432D
7 changed files with 60 additions and 14 deletions

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.Downloading.MediaDownloadWorker do
use Oban.Worker, use Oban.Worker,
queue: :media_fetching, queue: :media_fetching,
unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]], unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]],
tags: ["media_item", "media_fetching"] tags: ["media_item", "media_fetching", "show_in_dashboard"]
require Logger require Logger

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.Downloading.MediaQualityUpgradeWorker do
use Oban.Worker, use Oban.Worker,
queue: :media_fetching, queue: :media_fetching,
unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]], unique: [period: :infinity, states: [:available, :scheduled, :retryable, :executing]],
tags: ["media_item", "media_fetching"] tags: ["media_item", "media_fetching", "show_in_dashboard"]
require Logger require Logger

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.FastIndexing.FastIndexingWorker do
use Oban.Worker, use Oban.Worker,
queue: :fast_indexing, queue: :fast_indexing,
unique: [period: :infinity, states: [:available, :scheduled, :retryable]], unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
tags: ["media_source", "fast_indexing"] tags: ["media_source", "fast_indexing", "show_in_dashboard"]
require Logger require Logger

View file

@ -3,7 +3,7 @@ defmodule Pinchflat.Metadata.SourceMetadataStorageWorker do
use Oban.Worker, use Oban.Worker,
queue: :remote_metadata, queue: :remote_metadata,
tags: ["media_source", "source_metadata", "remote_metadata"], tags: ["media_source", "source_metadata", "remote_metadata", "show_in_dashboard"],
max_attempts: 3 max_attempts: 3
require Logger require Logger

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.SlowIndexing.MediaCollectionIndexingWorker do
use Oban.Worker, use Oban.Worker,
queue: :media_collection_indexing, queue: :media_collection_indexing,
unique: [period: :infinity, states: [:available, :scheduled, :retryable]], unique: [period: :infinity, states: [:available, :scheduled, :retryable]],
tags: ["media_source", "media_collection_indexing"] tags: ["media_source", "media_collection_indexing", "show_in_dashboard"]
require Logger require Logger

View file

@ -28,7 +28,9 @@ defmodule Pinchflat.Tasks.TasksQuery do
end end
def join_job(query) do def join_job(query) do
join(query, :inner, [t], j in assoc(t, :job)) query
|> join(:left, [t], j in assoc(t, :job))
|> preload([t, j], job: j)
end end
def in_state(states) when is_list(states) do def in_state(states) when is_list(states) do
@ -37,7 +39,7 @@ defmodule Pinchflat.Tasks.TasksQuery do
def in_state(state), do: in_state([state]) def in_state(state), do: in_state([state])
def has_worker(worker_name) do def has_tag(tag) do
dynamic([t, j], fragment("? LIKE ?", j.worker, ^"%.#{worker_name}")) dynamic([t, j], ^tag in j.tags)
end end
end end

View file

@ -3,13 +3,13 @@ defmodule Pinchflat.Pages.JobTableLive do
use Pinchflat.Tasks.TasksQuery use Pinchflat.Tasks.TasksQuery
alias Pinchflat.Repo alias Pinchflat.Repo
# alias Pinchflat.Utils.NumberUtils alias Pinchflat.Tasks.Task
alias PinchflatWeb.CustomComponents.TextComponents alias PinchflatWeb.CustomComponents.TextComponents
def render(%{tasks: []} = assigns) do def render(%{tasks: []} = assigns) do
~H""" ~H"""
<div class="mb-4 flex items-center"> <div class="mb-4 flex items-center">
<p class="ml-2">Nothing Here!</p> <p>Nothing here!</p>
</div> </div>
""" """
end end
@ -19,8 +19,19 @@ defmodule Pinchflat.Pages.JobTableLive do
<div> <div>
<div class="max-w-full overflow-x-auto"> <div class="max-w-full overflow-x-auto">
<.table rows={@tasks} table_class="text-white"> <.table rows={@tasks} table_class="text-white">
<:col :let={task} label="Job ID"> <:col :let={task} label="Task">
<%= task.job_id %> <%= worker_to_task_name(task.job.worker) %>
</:col>
<:col :let={task} label="Subject">
<.subtle_link href={task_to_link(task)}>
<%= StringUtils.truncate(task_to_record_name(task), 35) %>
</.subtle_link>
</:col>
<:col :let={task} label="Attempt No.">
<%= task.job.attempt %>
</:col>
<:col :let={task} label="Started At">
<%= format_datetime(task.job.attempted_at) %>
</:col> </:col>
</.table> </.table>
</div> </div>
@ -37,9 +48,42 @@ defmodule Pinchflat.Pages.JobTableLive do
defp get_tasks do defp get_tasks do
TasksQuery.new() TasksQuery.new()
|> TasksQuery.join_job() |> TasksQuery.join_job()
|> where(^TasksQuery.in_state("completed")) |> where(^TasksQuery.in_state(["executing", "completed"]))
|> limit(5) |> where(^TasksQuery.has_tag("show_in_dashboard"))
|> Repo.all() |> Repo.all()
|> Repo.preload([:media_item, :source])
end
defp worker_to_task_name(worker) do
final_module_part =
worker
|> String.split(".")
|> Enum.at(-1)
map_worker_to_task_name(final_module_part)
end
defp map_worker_to_task_name("FastIndexingWorker"), do: "Fast Indexing Source"
defp map_worker_to_task_name("MediaDownloadWorker"), do: "Download Media"
defp map_worker_to_task_name("MediaCollectionIndexingWorker"), do: "Indexing Source"
defp map_worker_to_task_name("MediaQualityUpgradeWorker"), do: "Upgrade Media Quality"
defp map_worker_to_task_name("SourceMetadataStorageWorker"), do: "Fetch Source Metadata"
defp map_worker_to_task_name(other), do: other <> " (Report to Devs)"
defp task_to_record_name(%Task{} = task) do
case task do
%Task{source: source} when source != nil -> source.custom_name
%Task{media_item: mi} when mi != nil -> mi.title
_ -> "Unknown Record"
end
end
defp task_to_link(%Task{} = task) do
case task do
%Task{source: source} when source != nil -> ~p"/sources/#{source.id}"
%Task{media_item: mi} when mi != nil -> ~p"/sources/#{mi.source_id}/media/#{mi}"
_ -> "#"
end
end end
defp format_datetime(nil), do: "" defp format_datetime(nil), do: ""