Skip to content

Commit

Permalink
Merge 9f8631b into 94f4c6a
Browse files Browse the repository at this point in the history
  • Loading branch information
mathiaHT committed Apr 7, 2021
2 parents 94f4c6a + 9f8631b commit b77b74a
Show file tree
Hide file tree
Showing 2 changed files with 173 additions and 64 deletions.
105 changes: 41 additions & 64 deletions lib/step_flow/workflows/workflows.ex
Expand Up @@ -10,6 +10,7 @@ defmodule StepFlow.Workflows do
alias StepFlow.Jobs.Status
alias StepFlow.Progressions.Progression
alias StepFlow.Repo
alias StepFlow.Workflows
alias StepFlow.Workflows.Workflow

require Logger
Expand Down Expand Up @@ -57,8 +58,7 @@ defmodule StepFlow.Workflows do
|> filter_query(params, :version_micro)
|> date_before_filter_query(params, :before_date)
|> date_after_filter_query(params, :after_date)

query = filter_status(query, params)
|> filter_status(params, :states)

query =
case StepFlow.Map.get_by_key_or_atom(params, :ids) do
Expand Down Expand Up @@ -108,69 +108,24 @@ defmodule StepFlow.Workflows do
}
end

defp get_status(status, completed_status) do
if status != nil do
if Status.state_enum_label(:completed) in status do
if status == completed_status do
:completed
else
nil
end
else
if Status.state_enum_label(:error) in status do
:error
else
:processing
end
end
else
nil
end
end

defp filter_status(query, params) do
status = Map.get(params, "state")

completed_status = [
Status.state_enum_label(:completed)
]

case get_status(status, completed_status) do
def filter_status(query, params, key) do
case StepFlow.Map.get_by_key_or_atom(params, key) do
nil ->
query

:completed ->
states ->
from(
workflow in query,
left_join: artifact in assoc(workflow, :artifacts),
where: not is_nil(artifact.id)
)

:error ->
completed_jobs_to_exclude =
from(
workflow in query,
join: job in assoc(workflow, :jobs),
join: status in assoc(job, :status),
where: status.state in ^completed_status,
group_by: workflow.id
)

from(
workflow in query,
join: job in assoc(workflow, :jobs),
join: status in assoc(job, :status),
where: status.state in ^status,
group_by: workflow.id,
except: ^completed_jobs_to_exclude
)

:processing ->
from(
workflow in query,
join: jobs in assoc(workflow, :jobs),
join: status in assoc(jobs, :status),
where: status.state in ^status
join:
workflow_status in subquery(
from(
workflow_status in Workflows.Status,
order_by: [desc: workflow_status.id, desc: workflow_status.workflow_id],
distinct: [desc: workflow_status.workflow_id]
)
),
on: workflow.id == workflow_status.workflow_id,
where: workflow_status.state in ^states
)
end
end
Expand All @@ -191,8 +146,19 @@ defmodule StepFlow.Workflows do
query

date_value ->
date = Date.from_iso8601!(date_value)
from(workflow in query, where: fragment("?::date", workflow.inserted_at) <= ^date)
datetime =
case NaiveDateTime.from_iso8601(date_value) do
{:ok, date} ->
date

_ ->
NaiveDateTime.new!(
Date.from_iso8601!(date_value),
Time.new!(23, 59, 59, 999_999)
)
end

from(workflow in query, where: fragment("?::timestamp", workflow.inserted_at) <= ^datetime)
end
end

Expand All @@ -202,8 +168,19 @@ defmodule StepFlow.Workflows do
query

date_value ->
date = Date.from_iso8601!(date_value)
from(workflow in query, where: fragment("?::date", workflow.inserted_at) >= ^date)
datetime =
case NaiveDateTime.from_iso8601(date_value) do
{:ok, date} ->
date

_ ->
NaiveDateTime.new!(
Date.from_iso8601!(date_value),
Time.new!(23, 59, 59, 999_999)
)
end

from(workflow in query, where: fragment("?::timestamp", workflow.inserted_at) >= ^datetime)
end
end

Expand Down
132 changes: 132 additions & 0 deletions test/workflows/workflows_test.exs
Expand Up @@ -107,6 +107,138 @@ defmodule StepFlow.WorkflowsTest do
}
end

test "list_workflows/0 returns workflows with different status" do
workflow =
workflow_fixture()
|> Repo.preload([:artifacts, :jobs])

Workflows.Status.set_workflow_status(workflow.id, :pending)

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"states" => ["pending"]})

assert page == 0
assert size == 10
assert total == 1

Workflows.Status.set_workflow_status(workflow.id, :error)

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"states" => ["error"]})

assert page == 0
assert size == 10
assert total == 1

Workflows.Status.set_workflow_status(workflow.id, :processing)

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"states" => ["processing"]})

assert page == 0
assert size == 10
assert total == 1

Workflows.Status.set_workflow_status(workflow.id, :completed)

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"states" => ["completed"]})

assert page == 0
assert size == 10
assert total == 1
end

test "list_workflows/0 returns workflows with before date" do
workflow_fixture()
today = Date.utc_today() |> Date.to_iso8601()

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"before_date" => today})

assert page == 0
assert size == 10
assert total == 1

now = NaiveDateTime.utc_now() |> NaiveDateTime.to_iso8601()

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"before_date" => now})

assert page == 0
assert size == 10
assert total == 1

yesterday = Date.utc_today() |> Date.add(-1) |> Date.to_iso8601()

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"before_date" => yesterday})

assert page == 0
assert size == 10
assert total == 0
end

test "list_workflows/0 returns workflows with after date" do
workflow_fixture()
yesterday = Date.utc_today() |> Date.add(-1) |> Date.to_iso8601()

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"after_date" => yesterday})

assert page == 0
assert size == 10
assert total == 1

yesterday_time = NaiveDateTime.utc_now() |> NaiveDateTime.add(-86400, :second) |> NaiveDateTime.to_iso8601()

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"after_date" => yesterday_time})

assert page == 0
assert size == 10
assert total == 1

today = Date.utc_today() |> Date.to_iso8601()

%{
page: page,
size: size,
total: total
} = Workflows.list_workflows(%{"after_date" => today})

assert page == 0
assert size == 10
assert total == 0
end

test "get_workflow!/1 returns the workflow with given id" do
workflow =
workflow_fixture()
Expand Down

0 comments on commit b77b74a

Please sign in to comment.