diff --git a/.build b/.build
index 24cc337bd4..531935e3db 100644
--- a/.build
+++ b/.build
@@ -338,7 +338,7 @@ dist/merriweather-latin-ext-300-normal-K6L27CZ5.woff2
dist/merriweather-vietnamese-300-italic-EHHNZPUO.woff2
dist/merriweather-vietnamese-300-normal-U376L4Z4.woff2
dist/remixicon-NKANDIL5.woff2
-dist/search_data-47870F19.js
+dist/search_data-09F44865.js
dist/sidebar_items-AB975E23.js
index.html
provisioning.html
diff --git a/Lightning.Accounts.html b/Lightning.Accounts.html
index eab54943a8..7253ccaece 100644
--- a/Lightning.Accounts.html
+++ b/Lightning.Accounts.html
@@ -785,10 +785,10 @@
apply_user_email(user, password, attrs)
Examples
-iex> apply_user_email(user, "valid password", %{email: ...})
-{:ok, %User{}}role: :superuser
-iex> apply_user_email(user, "invalid password", %{email: ...})
-{:error, %Ecto.Changeset{}}
+iex> apply_user_email(user, "valid password", %{email: ...})
+{:ok, %User{}}role: :superuser
+iex> apply_user_email(user, "invalid password", %{email: ...})
+{:error, %Ecto.Changeset{}}
@@ -840,8 +840,8 @@ change_scheduled_deletion(user, attrs \\ %{
Examples
-iex> change_scheduled_deletion(user)
-%Ecto.Changeset{data: %User{}}
+iex> change_scheduled_deletion(user)
+%Ecto.Changeset{data: %User{}}
@@ -877,8 +877,8 @@ change_superuser_registration(attrs \\ %{})
Examples
-iex> change_superuser_registration(user)
-%Ecto.Changeset{data: %User{}}
+iex> change_superuser_registration(user)
+%Ecto.Changeset{data: %User{}}
@@ -930,8 +930,8 @@ change_user_email(user, attrs \\ %{})
Examples
-iex> change_user_email(user)
-%Ecto.Changeset{data: %User{}}
+iex> change_user_email(user)
+%Ecto.Changeset{data: %User{}}
@@ -985,8 +985,8 @@ change_user_password(user, attrs \\ %{})
Examples
-iex> change_user_password(user)
-%Ecto.Changeset{data: %User{}}
+iex> change_user_password(user)
+%Ecto.Changeset{data: %User{}}
@@ -1016,8 +1016,8 @@ change_user_registration(attrs \\ %{})
Examples
-iex> change_user_registration(user)
-%Ecto.Changeset{data: %User{}}
+iex> change_user_registration(user)
+%Ecto.Changeset{data: %User{}}
@@ -1178,11 +1178,11 @@ delete_token(token)
Examples
-iex> delete_token(token)
-{:ok, %UserToken{}}
+iex> delete_token(token)
+{:ok, %UserToken{}}
-iex> delete_token(token)
-{:error, %Ecto.Changeset{}}
+iex> delete_token(token)
+{:error, %Ecto.Changeset{}}
@@ -1210,11 +1210,11 @@ delete_user(user)
Examples
-iex> delete_user(user)
-{:ok, %User{}}
+iex> delete_user(user)
+{:ok, %User{}}
-iex> delete_user(user)
-{:error, %Ecto.Changeset{}}
+iex> delete_user(user)
+{:error, %Ecto.Changeset{}}
@@ -1271,11 +1271,11 @@ deliver_user_confirmation_instructions(user
Examples
-iex> deliver_user_confirmation_instructions(user)
-{:ok, %{to: ..., body: ...}}
+iex> deliver_user_confirmation_instructions(user)
+{:ok, %{to: ..., body: ...}}
-iex> deliver_user_confirmation_instructions(confirmed_user)
-{:error, :already_confirmed}
+iex> deliver_user_confirmation_instructions(confirmed_user)
+{:error, :already_confirmed}
@@ -1325,8 +1325,8 @@ deliver_user_reset_password_instructions(us
Examples
-iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1))
-{:ok, %{to: ..., body: ...}}
+iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1))
+{:ok, %{to: ..., body: ...}}
@@ -1464,10 +1464,10 @@ get_token!(id)
Examples
-iex> get_token!(123)
-%UserToken{}
+iex> get_token!(123)
+%UserToken{}
-iex> get_token!(456)
+iex> get_token!(456)
** (Ecto.NoResultsError)
@@ -1496,10 +1496,10 @@ get_user!(id)
Examples
-iex> get_user!(123)
-%User{}
+iex> get_user!(123)
+%User{}
-iex> get_user!(456)
+iex> get_user!(456)
** (Ecto.NoResultsError)
@@ -1572,10 +1572,10 @@ get_user_by_email(email)
Examples
-iex> get_user_by_email("foo@example.com")
-%User{}
+iex> get_user_by_email("foo@example.com")
+%User{}
-iex> get_user_by_email("unknown@example.com")
+iex> get_user_by_email("unknown@example.com")
nil
@@ -1604,10 +1604,10 @@ get_user_by_email_and_password(email, passw
Examples
-iex> get_user_by_email_and_password("foo@example.com", "correct_password")
-%User{}
+iex> get_user_by_email_and_password("foo@example.com", "correct_password")
+%User{}
-iex> get_user_by_email_and_password("foo@example.com", "invalid_password")
+iex> get_user_by_email_and_password("foo@example.com", "invalid_password")
nil
@@ -1636,10 +1636,10 @@ get_user_by_reset_password_token(token)
Examples
-iex> get_user_by_reset_password_token("validtoken")
-%User{}
+iex> get_user_by_reset_password_token("validtoken")
+%User{}
-iex> get_user_by_reset_password_token("invalidtoken")
+iex> get_user_by_reset_password_token("invalidtoken")
nil
@@ -1836,8 +1836,8 @@ list_users()
Examples
-iex> list_users()
-[%User{}, ...]
+iex> list_users()
+[%User{}, ...]
@@ -1966,11 +1966,11 @@ register_superuser(attrs)
Examples
-iex> register_superuser(%{field: value})
-{:ok, %User{}}
+iex> register_superuser(%{field: value})
+{:ok, %User{}}
-iex> register_superuser(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> register_superuser(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -2008,11 +2008,11 @@ register_user(attrs)
Examples
-iex> register_user(%{field: value})
-{:ok, %User{}}
+iex> register_user(%{field: value})
+{:ok, %User{}}
-iex> register_user(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> register_user(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -2062,7 +2062,7 @@ request_email_update(user, new_email)
Examples
-iex> request_email_update(user, new_email)
+iex> request_email_update(user, new_email)
:ok
@@ -2091,11 +2091,11 @@ reset_user_password(user, attrs)
Examples
-iex> reset_user_password(user, %{password: "new long password", password_confirmation: "new long password"})
-{:ok, %User{}}
+iex> reset_user_password(user, %{password: "new long password", password_confirmation: "new long password"})
+{:ok, %User{}}
-iex> reset_user_password(user, %{password: "valid", password_confirmation: "not the same"})
-{:error, %Ecto.Changeset{}}
+iex> reset_user_password(user, %{password: "valid", password_confirmation: "not the same"})
+{:error, %Ecto.Changeset{}}
@@ -2261,11 +2261,11 @@ update_user_password(user, password, attrs)
Examples
-iex> update_user_password(user, "valid password", %{password: ...})
-{:ok, %User{}}
+iex> update_user_password(user, "valid password", %{password: ...})
+{:ok, %User{}}
-iex> update_user_password(user, "invalid password", %{password: ...})
-{:error, %Ecto.Changeset{}}
+iex> update_user_password(user, "invalid password", %{password: ...})
+{:error, %Ecto.Changeset{}}
@@ -2392,8 +2392,8 @@ validate_change_user_email(user, params \\
Examples
-iex> validate_change_user_email(user, %{"email" => "new@example.com", "current_password" => "secret"})
-%Ecto.Changeset{...}
+iex> validate_change_user_email(user, %{"email" => "new@example.com", "current_password" => "secret"})
+%Ecto.Changeset{...}
diff --git a/Lightning.AdaptorRegistry.Npm.html b/Lightning.AdaptorRegistry.Npm.html
index e54b4cc380..448888f8e0 100644
--- a/Lightning.AdaptorRegistry.Npm.html
+++ b/Lightning.AdaptorRegistry.Npm.html
@@ -1690,14 +1690,14 @@ request(request)
Examples
-request = %HTTPoison.Request{
+request = %HTTPoison.Request{
method: :post,
url: "https://my.website.com",
body: "{\"foo\": 3}",
- headers: [{"Accept", "application/json"}]
-}
+ headers: [{"Accept", "application/json"}]
+}
-request(request)
+request(request)
@@ -1755,7 +1755,7 @@ request(method, url, body \\ "",
Examples
-request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
+request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
diff --git a/Lightning.AdaptorRegistry.html b/Lightning.AdaptorRegistry.html
index cfd81ceed0..3aea7c6118 100644
--- a/Lightning.AdaptorRegistry.html
+++ b/Lightning.AdaptorRegistry.html
@@ -140,9 +140,9 @@
Registry process to query and maintain a list of adaptors available for
writing jobs.
Currently it queries NPM for all modules in the @openfn
organization and
filters out modules that are known not to be adaptors.
Usage
# Starting the process
-AdaptorRegistry.start_link()
+AdaptorRegistry.start_link()
# Getting a list of all adaptors
-Lightning.AdaptorRegistry.AdaptorRegistry.all()
Caching
By default the results are cached to disk, and will be reused every start.
In order to disable or configure caching pass see: start_link/1
.
The process uses :continue
to return before the adaptors have been queried.
+
Lightning.AdaptorRegistry.AdaptorRegistry.all()
Caching
By default the results are cached to disk, and will be reused every start.
In order to disable or configure caching pass see: start_link/1
.
The process uses :continue
to return before the adaptors have been queried.
This does mean that the first call to the process will be delayed until
the handle_continue/2
has finished.
Timeouts
There is a 'general' timeout of 30s, this is used for GenServer calls like
all/1
and also internally when the modules are being queried. NPM can
@@ -432,10 +432,10 @@
resolve_package_name(package_name)
-Destructures an NPM style package name into module name and version.
Example
iex> resolve_package_name("@openfn/language-salesforce@1.2.3")
-{ "@openfn/language-salesforce", "1.2.3" }
-iex> resolve_package_name("@openfn/language-salesforce")
-{ "@openfn/language-salesforce", nil }
+Destructures an NPM style package name into module name and version.
Example
iex> resolve_package_name("@openfn/language-salesforce@1.2.3")
+{ "@openfn/language-salesforce", "1.2.3" }
+iex> resolve_package_name("@openfn/language-salesforce")
+{ "@openfn/language-salesforce", nil }
diff --git a/Lightning.AiAssistant.html b/Lightning.AiAssistant.html
index b781cf583f..24dda6e24e 100644
--- a/Lightning.AiAssistant.html
+++ b/Lightning.AiAssistant.html
@@ -508,8 +508,8 @@ query(session, content)
-Queries the AI assistant with the given content.
Returns {:ok, session}
if the query was successful, otherwise :error
.
Example
iex> AiAssistant.query(session, "fn()")
-{:ok, session}
+Queries the AI assistant with the given content.
Returns {:ok, session}
if the query was successful, otherwise :error
.
Example
iex> AiAssistant.query(session, "fn()")
+{:ok, session}
diff --git a/Lightning.AuthProviders.OauthHTTPClient.html b/Lightning.AuthProviders.OauthHTTPClient.html
index 3bddde565e..281c6c82ab 100644
--- a/Lightning.AuthProviders.OauthHTTPClient.html
+++ b/Lightning.AuthProviders.OauthHTTPClient.html
@@ -495,11 +495,11 @@ delete(client, url, opts)
-Perform a DELETE request.
See request/1
or request/2
for options definition.
delete("/users")
-delete("/users", query: [scope: "admin"])
-delete(client, "/users")
-delete(client, "/users", query: [scope: "admin"])
-delete(client, "/users", body: %{name: "Jon"})
+Perform a DELETE request.
See request/1
or request/2
for options definition.
delete("/users")
+delete("/users", query: [scope: "admin"])
+delete(client, "/users")
+delete(client, "/users", query: [scope: "admin"])
+delete(client, "/users", body: %{name: "Jon"})
@@ -528,11 +528,11 @@ delete!(client, url, opts)
-Perform a DELETE request.
See request!/1
or request!/2
for options definition.
delete!("/users")
-delete!("/users", query: [scope: "admin"])
-delete!(client, "/users")
-delete!(client, "/users", query: [scope: "admin"])
-delete!(client, "/users", body: %{name: "Jon"})
+Perform a DELETE request.
See request!/1
or request!/2
for options definition.
delete!("/users")
+delete!("/users", query: [scope: "admin"])
+delete!(client, "/users")
+delete!(client, "/users", query: [scope: "admin"])
+delete!(client, "/users", body: %{name: "Jon"})
@@ -662,11 +662,11 @@ get(client, url, opts)
-Perform a GET request.
See request/1
or request/2
for options definition.
get("/users")
-get("/users", query: [scope: "admin"])
-get(client, "/users")
-get(client, "/users", query: [scope: "admin"])
-get(client, "/users", body: %{name: "Jon"})
+Perform a GET request.
See request/1
or request/2
for options definition.
get("/users")
+get("/users", query: [scope: "admin"])
+get(client, "/users")
+get(client, "/users", query: [scope: "admin"])
+get(client, "/users", body: %{name: "Jon"})
@@ -695,11 +695,11 @@ get!(client, url, opts)
-Perform a GET request.
See request!/1
or request!/2
for options definition.
get!("/users")
-get!("/users", query: [scope: "admin"])
-get!(client, "/users")
-get!(client, "/users", query: [scope: "admin"])
-get!(client, "/users", body: %{name: "Jon"})
+Perform a GET request.
See request!/1
or request!/2
for options definition.
get!("/users")
+get!("/users", query: [scope: "admin"])
+get!(client, "/users")
+get!(client, "/users", query: [scope: "admin"])
+get!(client, "/users", body: %{name: "Jon"})
@@ -727,11 +727,11 @@ head(client, url, opts)
-Perform a HEAD request.
See request/1
or request/2
for options definition.
head("/users")
-head("/users", query: [scope: "admin"])
-head(client, "/users")
-head(client, "/users", query: [scope: "admin"])
-head(client, "/users", body: %{name: "Jon"})
+Perform a HEAD request.
See request/1
or request/2
for options definition.
head("/users")
+head("/users", query: [scope: "admin"])
+head(client, "/users")
+head(client, "/users", query: [scope: "admin"])
+head(client, "/users", body: %{name: "Jon"})
@@ -760,11 +760,11 @@ head!(client, url, opts)
-Perform a HEAD request.
See request!/1
or request!/2
for options definition.
head!("/users")
-head!("/users", query: [scope: "admin"])
-head!(client, "/users")
-head!(client, "/users", query: [scope: "admin"])
-head!(client, "/users", body: %{name: "Jon"})
+Perform a HEAD request.
See request!/1
or request!/2
for options definition.
head!("/users")
+head!("/users", query: [scope: "admin"])
+head!(client, "/users")
+head!(client, "/users", query: [scope: "admin"])
+head!(client, "/users", body: %{name: "Jon"})
@@ -792,11 +792,11 @@ options(client, url, opts)
-Perform a OPTIONS request.
See request/1
or request/2
for options definition.
options("/users")
-options("/users", query: [scope: "admin"])
-options(client, "/users")
-options(client, "/users", query: [scope: "admin"])
-options(client, "/users", body: %{name: "Jon"})
+Perform a OPTIONS request.
See request/1
or request/2
for options definition.
options("/users")
+options("/users", query: [scope: "admin"])
+options(client, "/users")
+options(client, "/users", query: [scope: "admin"])
+options(client, "/users", body: %{name: "Jon"})
@@ -825,11 +825,11 @@ options!(client, url, opts)
-Perform a OPTIONS request.
See request!/1
or request!/2
for options definition.
options!("/users")
-options!("/users", query: [scope: "admin"])
-options!(client, "/users")
-options!(client, "/users", query: [scope: "admin"])
-options!(client, "/users", body: %{name: "Jon"})
+Perform a OPTIONS request.
See request!/1
or request!/2
for options definition.
options!("/users")
+options!("/users", query: [scope: "admin"])
+options!(client, "/users")
+options!(client, "/users", query: [scope: "admin"])
+options!(client, "/users", body: %{name: "Jon"})
@@ -858,10 +858,10 @@ patch(client, url, body, opts)
-Perform a PATCH request.
See request/1
or request/2
for options definition.
patch("/users", %{name: "Jon"})
-patch("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch(client, "/users", %{name: "Jon"})
-patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PATCH request.
See request/1
or request/2
for options definition.
patch("/users", %{name: "Jon"})
+patch("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch(client, "/users", %{name: "Jon"})
+patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -890,10 +890,10 @@ patch!(client, url, body, opts)
-Perform a PATCH request.
See request!/1
or request!/2
for options definition.
patch!("/users", %{name: "Jon"})
-patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch!(client, "/users", %{name: "Jon"})
-patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PATCH request.
See request!/1
or request!/2
for options definition.
patch!("/users", %{name: "Jon"})
+patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch!(client, "/users", %{name: "Jon"})
+patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -922,10 +922,10 @@ post(client, url, body, opts)
-Perform a POST request.
See request/1
or request/2
for options definition.
post("/users", %{name: "Jon"})
-post("/users", %{name: "Jon"}, query: [scope: "admin"])
-post(client, "/users", %{name: "Jon"})
-post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a POST request.
See request/1
or request/2
for options definition.
post("/users", %{name: "Jon"})
+post("/users", %{name: "Jon"}, query: [scope: "admin"])
+post(client, "/users", %{name: "Jon"})
+post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -954,10 +954,10 @@ post!(client, url, body, opts)
-Perform a POST request.
See request!/1
or request!/2
for options definition.
post!("/users", %{name: "Jon"})
-post!("/users", %{name: "Jon"}, query: [scope: "admin"])
-post!(client, "/users", %{name: "Jon"})
-post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a POST request.
See request!/1
or request!/2
for options definition.
post!("/users", %{name: "Jon"})
+post!("/users", %{name: "Jon"}, query: [scope: "admin"])
+post!(client, "/users", %{name: "Jon"})
+post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -986,10 +986,10 @@ put(client, url, body, opts)
-Perform a PUT request.
See request/1
or request/2
for options definition.
put("/users", %{name: "Jon"})
-put("/users", %{name: "Jon"}, query: [scope: "admin"])
-put(client, "/users", %{name: "Jon"})
-put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PUT request.
See request/1
or request/2
for options definition.
put("/users", %{name: "Jon"})
+put("/users", %{name: "Jon"}, query: [scope: "admin"])
+put(client, "/users", %{name: "Jon"})
+put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1018,10 +1018,10 @@ put!(client, url, body, opts)
-Perform a PUT request.
See request!/1
or request!/2
for options definition.
put!("/users", %{name: "Jon"})
-put!("/users", %{name: "Jon"}, query: [scope: "admin"])
-put!(client, "/users", %{name: "Jon"})
-put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PUT request.
See request!/1
or request!/2
for options definition.
put!("/users", %{name: "Jon"})
+put!("/users", %{name: "Jon"}, query: [scope: "admin"])
+put!(client, "/users", %{name: "Jon"})
+put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1097,11 +1097,11 @@ request(client \\ %Tesla.Client{}, options)
Examples
-ExampleApi.request(method: :get, url: "/users/path")
+ExampleApi.request(method: :get, url: "/users/path")
# use shortcut methods
-ExampleApi.get("/users/1")
-ExampleApi.post(client, "/users", %{name: "Jon"})
+ExampleApi.get("/users/1")
+ExampleApi.post(client, "/users", %{name: "Jon"})
@@ -1237,11 +1237,11 @@ trace(client, url, opts)
-Perform a TRACE request.
See request/1
or request/2
for options definition.
trace("/users")
-trace("/users", query: [scope: "admin"])
-trace(client, "/users")
-trace(client, "/users", query: [scope: "admin"])
-trace(client, "/users", body: %{name: "Jon"})
+Perform a TRACE request.
See request/1
or request/2
for options definition.
trace("/users")
+trace("/users", query: [scope: "admin"])
+trace(client, "/users")
+trace(client, "/users", query: [scope: "admin"])
+trace(client, "/users", body: %{name: "Jon"})
@@ -1270,11 +1270,11 @@ trace!(client, url, opts)
-Perform a TRACE request.
See request!/1
or request!/2
for options definition.
trace!("/users")
-trace!("/users", query: [scope: "admin"])
-trace!(client, "/users")
-trace!(client, "/users", query: [scope: "admin"])
-trace!(client, "/users", body: %{name: "Jon"})
+Perform a TRACE request.
See request!/1
or request!/2
for options definition.
trace!("/users")
+trace!("/users", query: [scope: "admin"])
+trace!(client, "/users")
+trace!(client, "/users", query: [scope: "admin"])
+trace!(client, "/users", body: %{name: "Jon"})
diff --git a/Lightning.AuthProviders.WellKnown.html b/Lightning.AuthProviders.WellKnown.html
index c8bbd944d1..e93b08583e 100644
--- a/Lightning.AuthProviders.WellKnown.html
+++ b/Lightning.AuthProviders.WellKnown.html
@@ -1866,14 +1866,14 @@ request(request)
Examples
-request = %HTTPoison.Request{
+request = %HTTPoison.Request{
method: :post,
url: "https://my.website.com",
body: "{\"foo\": 3}",
- headers: [{"Accept", "application/json"}]
-}
+ headers: [{"Accept", "application/json"}]
+}
-request(request)
+request(request)
@@ -1931,7 +1931,7 @@ request(method, url, body \\ "",
Examples
-request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
+request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
diff --git a/Lightning.BuildMacros.html b/Lightning.BuildMacros.html
index 03706980f4..a4bea29bdf 100644
--- a/Lightning.BuildMacros.html
+++ b/Lightning.BuildMacros.html
@@ -211,13 +211,13 @@ do_in(envs, list)
Examples
-do_in(:dev) do
- IO.puts("This will only be printed in the dev environment")
-end
+do_in(:dev) do
+ IO.puts("This will only be printed in the dev environment")
+end
-do_in([:dev, :test]) do
- IO.puts("This will only be printed in the dev and test environments")
-end
+do_in([:dev, :test]) do
+ IO.puts("This will only be printed in the dev and test environments")
+end
diff --git a/Lightning.CLI.Result.html b/Lightning.CLI.Result.html
index ba7daaa08c..c72494ed24 100644
--- a/Lightning.CLI.Result.html
+++ b/Lightning.CLI.Result.html
@@ -144,7 +144,7 @@
Logs
The OpenFn CLI returns JSON formatted log lines, which are decoded and added
-to a Result
struct.
There are two kinds of output:
{"level":"<<level>>","name":"<<module>>","message":"..."],"time":<<timestamp>>}
These are usually for general logging, and debugging.
{"message":["<<message|filepath|output>>"]}
The above is the equivalent of the output of a command
+to a Result
struct.There are two kinds of output:
{"level":"<<level>>","name":"<<module>>","message":"..."],"time":<<timestamp>>}
These are usually for general logging, and debugging.
{"message":["<<message|filepath|output>>"]}
The above is the equivalent of the output of a command
diff --git a/Lightning.Config.Bootstrap.html b/Lightning.Config.Bootstrap.html
index 594b228383..ee7044bfa6 100644
--- a/Lightning.Config.Bootstrap.html
+++ b/Lightning.Config.Bootstrap.html
@@ -143,8 +143,8 @@
called from other places (aside from config/runtime.exs
) file.Sourcing envs
Internally this module uses Dotenvy.source/1
to source environment variables
from the .env
, .env.<config_env>
, and .env.<config_env>.override
files.
It also sources the system environment variables.
Calling configure/0
without calling source_envs/0
or Dotenvy.source/2
-first will result in no environment variables being loaded.
Usage:
Lightning.Config.Bootstrap.source_envs()
-Lightning.Config.Bootstrap.configure()
+first will result in no environment variables being loaded.Usage:
Lightning.Config.Bootstrap.source_envs()
+Lightning.Config.Bootstrap.configure()
diff --git a/Lightning.Credentials.html b/Lightning.Credentials.html
index d355209a3e..d9cfcb5950 100644
--- a/Lightning.Credentials.html
+++ b/Lightning.Credentials.html
@@ -406,8 +406,8 @@ change_credential(credential, attrs \\ %{})
Examples
-iex> change_credential(credential)
-%Ecto.Changeset{data: %Credential{}}
+iex> change_credential(credential)
+%Ecto.Changeset{data: %Credential{}}
@@ -437,11 +437,11 @@ create_credential(attrs \\ %{})
Examples
-iex> create_credential(%{field: value})
-{:ok, %Credential{}}
+iex> create_credential(%{field: value})
+{:ok, %Credential{}}
-iex> create_credential(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_credential(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -469,11 +469,11 @@ delete_credential(credential)
Examples
-iex> delete_credential(credential)
-{:ok, %Credential{}}
+iex> delete_credential(credential)
+{:ok, %Credential{}}
-iex> delete_credential(credential)
-{:error, %Ecto.Changeset{}}
+iex> delete_credential(credential)
+{:error, %Ecto.Changeset{}}
@@ -501,10 +501,10 @@ get_credential!(id)
Examples
-iex> get_credential!(123)
-%Credential{}
+iex> get_credential!(123)
+%Credential{}
-iex> get_credential!(456)
+iex> get_credential!(456)
** (Ecto.NoResultsError)
@@ -617,10 +617,10 @@ has_activity_in_projects?(credential)
Examples
-iex> has_activity_in_projects?(%Credential{id: some_id})
+iex> has_activity_in_projects?(%Credential{id: some_id})
true
-iex> has_activity_in_projects?(%Credential{id: another_id})
+iex> has_activity_in_projects?(%Credential{id: another_id})
false
-iex> can_credential_be_shared_to_user(credential_id, user_id)
-[]
+iex> can_credential_be_shared_to_user(credential_id, user_id)
+[]
-iex> can_credential_be_shared_to_user(credential_id, user_id)
-["52ea8758-6ce5-43d7-912f-6a1e1f11dc55"]
+iex> can_credential_be_shared_to_user(credential_id, user_id)
+["52ea8758-6ce5-43d7-912f-6a1e1f11dc55"]
@@ -703,9 +703,9 @@ list_credentials(project)
Examples
- When given a Project:
iex> list_credentials(%Project{id: 1})
-[%Credential{project_id: 1}, %Credential{project_id: 1}]
When given a User:
iex> list_credentials(%User{id: 123})
-[%Credential{user_id: 123}, %Credential{user_id: 123}]
+ When given a Project:
iex> list_credentials(%Project{id: 1})
+[%Credential{project_id: 1}, %Credential{project_id: 1}]
When given a User:
iex> list_credentials(%User{id: 123})
+[%Credential{user_id: 123}, %Credential{user_id: 123}]
@@ -816,11 +816,11 @@ schedule_credential_deletion(credential)
Examples
-iex> schedule_credential_deletion(%Credential{id: some_id})
-{:ok, %Credential{}}
+iex> schedule_credential_deletion(%Credential{id: some_id})
+{:ok, %Credential{}}
-iex> schedule_credential_deletion(%Credential{})
-{:error, %Ecto.Changeset{}}
+iex> schedule_credential_deletion(%Credential{})
+{:error, %Ecto.Changeset{}}
@@ -877,11 +877,11 @@ update_credential(credential, attrs)
Examples
-iex> update_credential(credential, %{field: new_value})
-{:ok, %Credential{}}
+iex> update_credential(credential, %{field: new_value})
+{:ok, %Credential{}}
-iex> update_credential(credential, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_credential(credential, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Invocation.html b/Lightning.Invocation.html
index c9fc44e227..ed57e9c0c1 100644
--- a/Lightning.Invocation.html
+++ b/Lightning.Invocation.html
@@ -519,8 +519,8 @@ change_dataclip(dataclip, attrs \\ %{})
Examples
-iex> change_dataclip(dataclip)
-%Ecto.Changeset{data: %Dataclip{}}
+iex> change_dataclip(dataclip)
+%Ecto.Changeset{data: %Dataclip{}}
@@ -550,8 +550,8 @@ change_step(step, attrs \\ %{})
Examples
-iex> change_step(step)
-%Ecto.Changeset{data: %Step{}}
+iex> change_step(step)
+%Ecto.Changeset{data: %Step{}}
@@ -611,11 +611,11 @@ create_dataclip(attrs \\ %{})
Examples
-iex> create_dataclip(%{field: value})
-{:ok, %Dataclip{}}
+iex> create_dataclip(%{field: value})
+{:ok, %Dataclip{}}
-iex> create_dataclip(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_dataclip(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -643,11 +643,11 @@ delete_dataclip(dataclip)
Examples
-iex> delete_dataclip(dataclip)
-{:ok, %Dataclip{}}
+iex> delete_dataclip(dataclip)
+{:ok, %Dataclip{}}
-iex> delete_dataclip(dataclip)
-{:error, %Ecto.Changeset{}}
+iex> delete_dataclip(dataclip)
+{:error, %Ecto.Changeset{}}
@@ -682,14 +682,14 @@ get_dataclip(step)
Examples
-iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
-%Dataclip{}
+iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
+%Dataclip{}
-iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
+iex> get_dataclip("27b73932-16c7-4a72-86a3-85d805ccff98")
nil
-iex> get_dataclip(%Step{id: "a uuid"})
-%Dataclip{}
+iex> get_dataclip(%Step{id: "a uuid"})
+%Dataclip{}
@@ -723,10 +723,10 @@ get_dataclip!(id)
Examples
-iex> get_dataclip!(123)
-%Dataclip{}
+iex> get_dataclip!(123)
+%Dataclip{}
-iex> get_dataclip!(456)
+iex> get_dataclip!(456)
** (Ecto.NoResultsError)
@@ -924,10 +924,10 @@ get_step!(id)
Examples
-iex> get_step!(123)
-%Step{}
+iex> get_step!(123)
+%Step{}
-iex> get_step!(456)
+iex> get_step!(456)
** (Ecto.NoResultsError)
@@ -1056,8 +1056,8 @@ list_dataclips()
Examples
-iex> list_dataclips()
-[%Dataclip{}, ...]
+iex> list_dataclips()
+[%Dataclip{}, ...]
@@ -1166,8 +1166,8 @@ list_steps()
Examples
-iex> list_steps()
-[%Step{}, ...]
+iex> list_steps()
+[%Step{}, ...]
@@ -1294,7 +1294,7 @@ search_workorders(project)
Example:
-search_workorders(%Project{id: 1}, %SearchParams{status: ["completed"]})
+search_workorders(%Project{id: 1}, %SearchParams{status: ["completed"]})
@@ -1400,11 +1400,11 @@ update_dataclip(dataclip, attrs)
Examples
-iex> update_dataclip(dataclip, %{field: new_value})
-{:ok, %Dataclip{}}
+iex> update_dataclip(dataclip, %{field: new_value})
+{:ok, %Dataclip{}}
-iex> update_dataclip(dataclip, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_dataclip(dataclip, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Jobs.html b/Lightning.Jobs.html
index 75161f7f01..deb4766968 100644
--- a/Lightning.Jobs.html
+++ b/Lightning.Jobs.html
@@ -306,8 +306,8 @@ change_job(job, attrs \\ %{})
Examples
-iex> change_job(job)
-%Ecto.Changeset{data: %Job{}}
+iex> change_job(job)
+%Ecto.Changeset{data: %Job{}}
@@ -337,11 +337,11 @@ create_job(attrs \\ %{})
Examples
-iex> create_job(%{field: value})
-{:ok, %Job{}}
+iex> create_job(%{field: value})
+{:ok, %Job{}}
-iex> create_job(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_job(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -405,10 +405,10 @@ get_job!(id)
Examples
-iex> get_job!(123)
-%Job{}
+iex> get_job!(123)
+%Job{}
-iex> get_job!(456)
+iex> get_job!(456)
** (Ecto.NoResultsError)
@@ -620,11 +620,11 @@ update_job(job, attrs)
Examples
-iex> update_job(job, %{field: new_value})
-{:ok, %Job{}}
+iex> update_job(job, %{field: new_value})
+{:ok, %Job{}}
-iex> update_job(job, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_job(job, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.OauthClients.html b/Lightning.OauthClients.html
index 919f11a6df..27b49723d5 100644
--- a/Lightning.OauthClients.html
+++ b/Lightning.OauthClients.html
@@ -267,8 +267,8 @@ change_client(client, attrs \\ %{})
Examples
-iex> change_client(%OauthClient{}, %{name: "New Client"})
-%Ecto.Changeset{...}
+iex> change_client(%OauthClient{}, %{name: "New Client"})
+%Ecto.Changeset{...}
@@ -353,11 +353,11 @@ delete_client(client)
Examples
-iex> delete_client(client)
-{:ok, %OauthClient{}}
+iex> delete_client(client)
+{:ok, %OauthClient{}}
-iex> delete_client(client)
-{:error, %Ecto.Changeset{}}
+iex> delete_client(client)
+{:error, %Ecto.Changeset{}}
@@ -403,10 +403,10 @@ get_client!(id)
Examples
-iex> get_client!(123)
-%OauthClient{}
+iex> get_client!(123)
+%OauthClient{}
-iex> get_client!(456)
+iex> get_client!(456)
** (Ecto.NoResultsError)
@@ -447,9 +447,9 @@ list_clients(project)
Examples
- When given a Project:
iex> list_clients(%Project{id: 1})
-[%OauthClient{project_id: 1}, %OauthClient{project_id: 1}]
When given a User:
iex> list_clients(%User{id: 123})
-[%OauthClient{user_id: 123}, %OauthClient{user_id: 123}]
+ When given a Project:
iex> list_clients(%Project{id: 1})
+[%OauthClient{project_id: 1}, %OauthClient{project_id: 1}]
When given a User:
iex> list_clients(%User{id: 123})
+[%OauthClient{user_id: 123}, %OauthClient{user_id: 123}]
@@ -489,11 +489,11 @@ update_client(client, attrs)
Examples
-iex> update_client(client, %{field: new_value})
-{:ok, %OauthClient{}}
+iex> update_client(client, %{field: new_value})
+{:ok, %OauthClient{}}
-iex> update_client(client, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_client(client, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.Policies.Permissions.html b/Lightning.Policies.Permissions.html
index 1d1d48326c..1e90557476 100644
--- a/Lightning.Policies.Permissions.html
+++ b/Lightning.Policies.Permissions.html
@@ -138,13 +138,13 @@
This module defines a unique interface managing authorizations in Lightning.
Users in Lightning have instance-wide and project-wide roles which determine their level of access to resources in the application. Fo rmore details see the documentation.
These authorizations policies are all implemented under the lib/lightning/policies
folder. In that folder you can find 3 files:
- The
users.ex
file has all the policies for the instances wide access levels - The
project_users.ex
file has all the policies for the project wide access levels - The
permissions.ex
file defines the Lightning.Policies.Permissions.can/4
interface. Which is a wrapper around the Bodyguard.permit/4
function.
-We use that interface to be able to harmonize the use of policies accross the entire app.
All the policies are tested in the test/lightning/policies
folder. And the test are written in a way that allows the reader to quickly who can do what in the app.
We have two variants of the Lightning.Policies.Permissions.can/4
interface:
Lightning.Policies.Permissions.can(policy, action, actor, resource)
returns :ok
if the actor can perform the action on the resource and {:error, :unauthorized}
otherwise.Lightning.Policies.Permissions.can?(policy, action, actor, resource)
returns true
if the actor can perform the action on the resource and false
otherwise.
Here is an example of how we the Lightning.Policies.Permissions.can/4
interface to check if the a user can edit a job or not
can_edit_workflow = Lightning.Policies.ProjectUsers |> Lightning.Policies.Permissions.can?(:edit_workflow, socket.assigns.current_user, socket.assigns.project)
+We use that interface to be able to harmonize the use of policies accross the entire app.All the policies are tested in the test/lightning/policies
folder. And the test are written in a way that allows the reader to quickly who can do what in the app.
We have two variants of the Lightning.Policies.Permissions.can/4
interface:
Lightning.Policies.Permissions.can(policy, action, actor, resource)
returns :ok
if the actor can perform the action on the resource and {:error, :unauthorized}
otherwise.Lightning.Policies.Permissions.can?(policy, action, actor, resource)
returns true
if the actor can perform the action on the resource and false
otherwise.
Here is an example of how we the Lightning.Policies.Permissions.can/4
interface to check if the a user can edit a job or not
can_edit_workflow = Lightning.Policies.ProjectUsers |> Lightning.Policies.Permissions.can?(:edit_workflow, socket.assigns.current_user, socket.assigns.project)
-if can_edit_workflow do
+if can_edit_workflow do
# allow user to edit the workflow
-else
+else
# quick user out
-end
+end
@@ -220,11 +220,11 @@ can(policy, action, user, params \\ [])
Examples
-iex> can(Lightning.Policies.Users, :create_workflow, user, project)
+iex> can(Lightning.Policies.Users, :create_workflow, user, project)
:ok
-iex> can(Lightning.Policies.Users, :create_project, user, %{})
-{:error, :unauthorized}
+iex> can(Lightning.Policies.Users, :create_project, user, %{})
+{:error, :unauthorized}
@@ -254,10 +254,10 @@ can?(policy, action, user, params \\ [])
Examples
-iex> can(Lightning.Policies.Users, :create_workflow, user, project)
+iex> can(Lightning.Policies.Users, :create_workflow, user, project)
true
-iex> can(Lightning.Policies.Users, :create_project, user, %{})
+iex> can(Lightning.Policies.Users, :create_project, user, %{})
false
diff --git a/Lightning.Projects.html b/Lightning.Projects.html
index 88ad4e15c8..3eeb285551 100644
--- a/Lightning.Projects.html
+++ b/Lightning.Projects.html
@@ -654,8 +654,8 @@ change_project(project, attrs \\ %{})
Examples
-iex> change_project(project)
-%Ecto.Changeset{data: %Project{}}
+iex> change_project(project)
+%Ecto.Changeset{data: %Project{}}
@@ -687,11 +687,11 @@ create_project(attrs \\ %{}, schedule_email
Examples
-iex> create_project(%{field: value})
-{:ok, %Project{}}
+iex> create_project(%{field: value})
+{:ok, %Project{}}
-iex> create_project(%{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> create_project(%{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -720,11 +720,11 @@ delete_project(project)
Examples
-iex> delete_project(project)
-{:ok, %Project{}}
+iex> delete_project(project)
+{:ok, %Project{}}
-iex> delete_project(project)
-{:error, %Ecto.Changeset{}}
+iex> delete_project(project)
+{:error, %Ecto.Changeset{}}
@@ -789,8 +789,8 @@ export_project(atom, project_id, snapshot_i
Examples
-iex> export_project(:yaml, project_id)
-{:ok, string}
+iex> export_project(:yaml, project_id)
+{:ok, string}
@@ -840,10 +840,10 @@ get_project!(id)
Examples
-iex> get_project!(123)
-%Project{}
+iex> get_project!(123)
+%Project{}
-iex> get_project!(456)
+iex> get_project!(456)
** (Ecto.NoResultsError)
@@ -938,10 +938,10 @@ get_project_user!(id)
Examples
-iex> get_project_user!(123)
-%ProjectUser{}
+iex> get_project_user!(123)
+%ProjectUser{}
-iex> get_project_user!(456)
+iex> get_project_user!(456)
** (Ecto.NoResultsError)
@@ -971,16 +971,16 @@ get_project_user_role(user, project)
Examples
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:admin
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:viewer
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:editor
-iex> get_project_user_role(user, project)
+iex> get_project_user_role(user, project)
:owner
@@ -1031,10 +1031,10 @@ get_project_with_users!(id)
Examples
-iex> get_project!(123)
-%Project{}
+iex> get_project!(123)
+%Project{}
-iex> get_project!(456)
+iex> get_project!(456)
** (Ecto.NoResultsError)
@@ -1212,8 +1212,8 @@ list_projects()
Examples
-iex> list_projects()
-[%Project{}, ...]
+iex> list_projects()
+[%Project{}, ...]
@@ -1693,11 +1693,11 @@ update_project(project, attrs)
Examples
-iex> update_project(project, %{field: new_value})
-{:ok, %Project{}}
+iex> update_project(project, %{field: new_value})
+{:ok, %Project{}}
-iex> update_project(project, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_project(project, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -1725,11 +1725,11 @@ update_project_user(project_user, attrs)
Examples
-iex> update_project_user(project_user, %{field: new_value})
-{:ok, %ProjectUser{}}
+iex> update_project_user(project_user, %{field: new_value})
+{:ok, %ProjectUser{}}
-iex> update_project_user(projectUser, %{field: bad_value})
-{:error, %Ecto.Changeset{}}
+iex> update_project_user(projectUser, %{field: bad_value})
+{:error, %Ecto.Changeset{}}
@@ -1810,8 +1810,8 @@ validate_for_deletion(project, attrs)
Examples
-iex> validate_for_deletion(project)
-%Ecto.Changeset{data: %Project{}}
+iex> validate_for_deletion(project)
+%Ecto.Changeset{data: %Project{}}
diff --git a/Lightning.PromEx.html b/Lightning.PromEx.html
index 58a3419dfa..c607867d94 100644
--- a/Lightning.PromEx.html
+++ b/Lightning.PromEx.html
@@ -142,24 +142,24 @@
more details regarding configuring PromEx:config :lightning, Lightning.PromEx,
disabled: false,
manual_metrics_start_delay: :no_delay,
- drop_metrics_groups: [],
+ drop_metrics_groups: [],
grafana: :disabled,
metrics_server: :disabled
Add this module to your application supervision tree. It should be one of the first
things that is started so that no Telemetry events are missed. For example, if PromEx
is started after your Repo module, you will miss Ecto's init events and the dashboards
-will be missing some data points:
def start(_type, _args) do
- children = [
+will be missing some data points:def start(_type, _args) do
+ children = [
Lightning.PromEx,
...
- ]
+ ]
...
-end
Update your endpoint.ex
file to expose your metrics (or configure a standalone
+
end
Update your endpoint.ex
file to expose your metrics (or configure a standalone
server using the :metrics_server
config options). Be sure to put this plug before
your Plug.Telemetry
entry so that you can avoid having calls to your /metrics
endpoint create their own metrics and logs which can pollute your logs/metrics given
-that Prometheus will scrape at a regular interval and that can get noisy:
defmodule LightningWeb.Endpoint do
+that Prometheus will scrape at a regular interval and that can get noisy:defmodule LightningWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :lightning
...
@@ -167,7 +167,7 @@
plug PromEx.Plug, prom_ex_module: Lightning.PromEx
...
-end
Update the list of plugins in the plugins/0
function return list to reflect your
+
end
Update the list of plugins in the plugins/0
function return list to reflect your
application's dependencies. Also update the list of dashboards that are to be uploaded
to Grafana in the dashboards/0
function.
diff --git a/Lightning.Repo.html b/Lightning.Repo.html
index 6d50775c1e..27e8350a52 100644
--- a/Lightning.Repo.html
+++ b/Lightning.Repo.html
@@ -1738,13 +1738,13 @@ transact(fun, opts \\ [])
A small wrapper around Repo.transaction/2
.
Commits the transaction if the lambda returns :ok
or {:ok, result}
,
rolling it back if the lambda returns :error
or {:error, reason}
. In both
-cases, the function returns the result of the lambda.
Example:
Repo.transact(fn ->
- with {:ok, user} <- Accounts.create_user(params),
- {:ok, _log} <- Logs.log_action(:user_registered, user),
- {:ok, _job} <- Mailer.enqueue_email_confirmation(user) do
- {:ok, user}
- end
-end)
From blog post found here
+cases, the function returns the result of the lambda.Example:
Repo.transact(fn ->
+ with {:ok, user} <- Accounts.create_user(params),
+ {:ok, _log} <- Logs.log_action(:user_registered, user),
+ {:ok, _job} <- Mailer.enqueue_email_confirmation(user) do
+ {:ok, user}
+ end
+end)
From blog post found here
diff --git a/Lightning.Runs.Query.html b/Lightning.Runs.Query.html
index a592bce957..5184af921a 100644
--- a/Lightning.Runs.Query.html
+++ b/Lightning.Runs.Query.html
@@ -241,7 +241,7 @@ eligible_for_claim()
This query does not currently take into account the priority of the run.
To allow for prioritization, the query should be updated to order by
-priority.
eligible_for_claim() |> prepend_order_by([:priority])
+priority.eligible_for_claim() |> prepend_order_by([:priority])
diff --git a/Lightning.Runs.html b/Lightning.Runs.html
index f29751ee70..3092a162f3 100644
--- a/Lightning.Runs.html
+++ b/Lightning.Runs.html
@@ -477,7 +477,7 @@ get(id, opts \\ [])
-Get a run by id.
Optionally preload associations by passing a list of atoms to :include
.
Lightning.Runs.get(id, include: [:workflow])
+Get a run by id.
Optionally preload associations by passing a list of atoms to :include
.
Lightning.Runs.get(id, include: [:workflow])
diff --git a/Lightning.Runtime.LogAgent.html b/Lightning.Runtime.LogAgent.html
index b8e269fdf4..115f5e309d 100644
--- a/Lightning.Runtime.LogAgent.html
+++ b/Lightning.Runtime.LogAgent.html
@@ -138,9 +138,9 @@
Agent facility to consume STDOUT/STDERR byte by byte.
Since it works on a byte by byte basis, you will need to perform line-splitting
-yourself.
Usage:
{:ok, log} = LogAgent.start_link()
-"foo" = LogAgent.process_chunk(log, {:stdout, "foo"})
-"foobar" = LogAgent.process_chunk(log, {:stdout, "bar"})
+yourself.Usage:
{:ok, log} = LogAgent.start_link()
+"foo" = LogAgent.process_chunk(log, {:stdout, "foo"})
+"foobar" = LogAgent.process_chunk(log, {:stdout, "bar"})
diff --git a/Lightning.Runtime.RuntimeManager.html b/Lightning.Runtime.RuntimeManager.html
index 4ca0e94f3e..3648f52204 100644
--- a/Lightning.Runtime.RuntimeManager.html
+++ b/Lightning.Runtime.RuntimeManager.html
@@ -146,8 +146,8 @@
Sample:
config :lightining, Elixir.Lightning.Runtime.RuntimeManager,
version: "0.1.0",
start: true,
args: ~w(js/app.js --bundle --target=es2016 --outdir=../priv/static/assets),
-cd: Path.expand("../assets", __DIR__),
-env: %{}
Options:
cd: Path.expand("../assets", __DIR__),
+env: %{}
Options:
:version
- the expected runtime version
:start
- flag to start the runtime manager. If false
the GenServer
won't be started
:path
- the path to find the runtime executable at. By
default, it is automatically downloaded and placed inside
the _build
directory of your current app
Overriding the :path
is not recommended, as we will automatically
diff --git a/Lightning.Scrubber.html b/Lightning.Scrubber.html
index 346da3d6ba..487ae0c3e3 100644
--- a/Lightning.Scrubber.html
+++ b/Lightning.Scrubber.html
@@ -137,11 +137,11 @@
-Process used to scrub strings of sensitive information.
Can be started via start_link/1
.
{:ok, scrubber} =
- Lightning.Scrubber.start_link(
+Process used to scrub strings of sensitive information.
Can be started via start_link/1
.
{:ok, scrubber} =
+ Lightning.Scrubber.start_link(
samples:
- Lightning.Credentials.sensitive_values_for(credential)
- )
Takes an optional :name
key, in case you need to name the process.
+ Lightning.Credentials.sensitive_values_for(credential)
+ )
Takes an optional :name
key, in case you need to name the process.
diff --git a/Lightning.Storage.GCS.html b/Lightning.Storage.GCS.html
index 6d624bb869..6875056eda 100644
--- a/Lightning.Storage.GCS.html
+++ b/Lightning.Storage.GCS.html
@@ -150,10 +150,10 @@
Example Usage
# Store a file in GCS
-Lightning.Storage.GCS.store("/path/to/source", "destination/path")
+Lightning.Storage.GCS.store("/path/to/source", "destination/path")
# Get a signed URL for the stored file
-{:ok, url} = Lightning.Storage.GCS.get_url("destination/path")
+
{:ok, url} = Lightning.Storage.GCS.get_url("destination/path")
diff --git a/Lightning.Storage.Local.html b/Lightning.Storage.Local.html
index 3654c633f9..9ffd4c86ef 100644
--- a/Lightning.Storage.Local.html
+++ b/Lightning.Storage.Local.html
@@ -156,11 +156,11 @@
Example Usage
# Store a file
-{:ok, filename} =
- Lightning.Storage.Local.store("/path/to/source", "destination/path")
+{:ok, filename} =
+ Lightning.Storage.Local.store("/path/to/source", "destination/path")
# Get the URL for the stored file
-{:ok, url} = Lightning.Storage.Local.get_url("destination/path")
+
{:ok, url} = Lightning.Storage.Local.get_url("destination/path")
diff --git a/Lightning.Storage.ProjectFileDefinition.html b/Lightning.Storage.ProjectFileDefinition.html
index deb3764148..2c1cdaedde 100644
--- a/Lightning.Storage.ProjectFileDefinition.html
+++ b/Lightning.Storage.ProjectFileDefinition.html
@@ -138,13 +138,13 @@
This module provides functionality for managing the storage and retrieval of project files.
It handles operations related to storing project files, generating URLs for accessing these files, and constructing storage paths for exported files. It serves as an abstraction layer over the underlying storage mechanism provided by the Lightning.Storage
module.
## Functions
store/2
: Stores a file from a given source path into the storage system based on the file's path.get_url/1
: Retrieves the URL for accessing a stored file.storage_path_for_exports/2
: Constructs a storage path for exported files, defaulting to a .zip
extension.
## Example Usage
# Store a file
- Lightning.Storage.ProjectFileDefinition.store("/path/to/source", project_file)
+ Lightning.Storage.ProjectFileDefinition.store("/path/to/source", project_file)
# Get a URL for the stored file
- url = Lightning.Storage.ProjectFileDefinition.get_url(project_file)
+ url = Lightning.Storage.ProjectFileDefinition.get_url(project_file)
# Get the storage path for an exported file
- path = Lightning.Storage.ProjectFileDefinition.storage_path_for_exports(project_file)
+
path = Lightning.Storage.ProjectFileDefinition.storage_path_for_exports(project_file)
diff --git a/Lightning.TaskWorker.html b/Lightning.TaskWorker.html
index 8071a3cea7..4b91ff69db 100644
--- a/Lightning.TaskWorker.html
+++ b/Lightning.TaskWorker.html
@@ -140,7 +140,7 @@
A TaskWorker with concurrency limits.
A simple concurrency limiter that wraps Task.Supervisor
, which already does
have the ability to specify max_children
; it throws an error when
that limit is exceeded.
To use it, start it like any other process; ideally in your supervision tree.
...,
- {Lightning.TaskWorker, name: :cli_task_worker, max_tasks: 4}
Options
:max_tasks
Defaults to the number of system schedulers available to the vm.
+ {Lightning.TaskWorker, name: :cli_task_worker, max_tasks: 4}
Options
:max_tasks
Defaults to the number of system schedulers available to the vm.
diff --git a/Lightning.Validators.html b/Lightning.Validators.html
index 577f8a0932..29d4532d7b 100644
--- a/Lightning.Validators.html
+++ b/Lightning.Validators.html
@@ -233,10 +233,10 @@ validate_exclusive(changeset, fields, messa
Validate that only one of the fields is set at a time.
Example:
changeset
-|> validate_exclusive(
- [:source_job_id, :source_trigger_id],
+|> validate_exclusive(
+ [:source_job_id, :source_trigger_id],
"source_job_id and source_trigger_id are mutually exclusive"
-)
+)
diff --git a/Lightning.VersionControl.GithubClient.html b/Lightning.VersionControl.GithubClient.html
index f1be0fb8da..3577bbdd9f 100644
--- a/Lightning.VersionControl.GithubClient.html
+++ b/Lightning.VersionControl.GithubClient.html
@@ -868,11 +868,11 @@ delete(client, url, opts)
-Perform a DELETE request.
See request/1
or request/2
for options definition.
delete("/users")
-delete("/users", query: [scope: "admin"])
-delete(client, "/users")
-delete(client, "/users", query: [scope: "admin"])
-delete(client, "/users", body: %{name: "Jon"})
+Perform a DELETE request.
See request/1
or request/2
for options definition.
delete("/users")
+delete("/users", query: [scope: "admin"])
+delete(client, "/users")
+delete(client, "/users", query: [scope: "admin"])
+delete(client, "/users", body: %{name: "Jon"})
@@ -901,11 +901,11 @@ delete!(client, url, opts)
-Perform a DELETE request.
See request!/1
or request!/2
for options definition.
delete!("/users")
-delete!("/users", query: [scope: "admin"])
-delete!(client, "/users")
-delete!(client, "/users", query: [scope: "admin"])
-delete!(client, "/users", body: %{name: "Jon"})
+Perform a DELETE request.
See request!/1
or request!/2
for options definition.
delete!("/users")
+delete!("/users", query: [scope: "admin"])
+delete!(client, "/users")
+delete!(client, "/users", query: [scope: "admin"])
+delete!(client, "/users", body: %{name: "Jon"})
@@ -1021,11 +1021,11 @@ get(client, url, opts)
-Perform a GET request.
See request/1
or request/2
for options definition.
get("/users")
-get("/users", query: [scope: "admin"])
-get(client, "/users")
-get(client, "/users", query: [scope: "admin"])
-get(client, "/users", body: %{name: "Jon"})
+Perform a GET request.
See request/1
or request/2
for options definition.
get("/users")
+get("/users", query: [scope: "admin"])
+get(client, "/users")
+get(client, "/users", query: [scope: "admin"])
+get(client, "/users", body: %{name: "Jon"})
@@ -1054,11 +1054,11 @@ get!(client, url, opts)
-Perform a GET request.
See request!/1
or request!/2
for options definition.
get!("/users")
-get!("/users", query: [scope: "admin"])
-get!(client, "/users")
-get!(client, "/users", query: [scope: "admin"])
-get!(client, "/users", body: %{name: "Jon"})
+Perform a GET request.
See request!/1
or request!/2
for options definition.
get!("/users")
+get!("/users", query: [scope: "admin"])
+get!(client, "/users")
+get!(client, "/users", query: [scope: "admin"])
+get!(client, "/users", body: %{name: "Jon"})
@@ -1262,11 +1262,11 @@ head(client, url, opts)
-Perform a HEAD request.
See request/1
or request/2
for options definition.
head("/users")
-head("/users", query: [scope: "admin"])
-head(client, "/users")
-head(client, "/users", query: [scope: "admin"])
-head(client, "/users", body: %{name: "Jon"})
+Perform a HEAD request.
See request/1
or request/2
for options definition.
head("/users")
+head("/users", query: [scope: "admin"])
+head(client, "/users")
+head(client, "/users", query: [scope: "admin"])
+head(client, "/users", body: %{name: "Jon"})
@@ -1295,11 +1295,11 @@ head!(client, url, opts)
-Perform a HEAD request.
See request!/1
or request!/2
for options definition.
head!("/users")
-head!("/users", query: [scope: "admin"])
-head!(client, "/users")
-head!(client, "/users", query: [scope: "admin"])
-head!(client, "/users", body: %{name: "Jon"})
+Perform a HEAD request.
See request!/1
or request!/2
for options definition.
head!("/users")
+head!("/users", query: [scope: "admin"])
+head!(client, "/users")
+head!(client, "/users", query: [scope: "admin"])
+head!(client, "/users", body: %{name: "Jon"})
@@ -1327,11 +1327,11 @@ options(client, url, opts)
-Perform a OPTIONS request.
See request/1
or request/2
for options definition.
options("/users")
-options("/users", query: [scope: "admin"])
-options(client, "/users")
-options(client, "/users", query: [scope: "admin"])
-options(client, "/users", body: %{name: "Jon"})
+Perform a OPTIONS request.
See request/1
or request/2
for options definition.
options("/users")
+options("/users", query: [scope: "admin"])
+options(client, "/users")
+options(client, "/users", query: [scope: "admin"])
+options(client, "/users", body: %{name: "Jon"})
@@ -1360,11 +1360,11 @@ options!(client, url, opts)
-Perform a OPTIONS request.
See request!/1
or request!/2
for options definition.
options!("/users")
-options!("/users", query: [scope: "admin"])
-options!(client, "/users")
-options!(client, "/users", query: [scope: "admin"])
-options!(client, "/users", body: %{name: "Jon"})
+Perform a OPTIONS request.
See request!/1
or request!/2
for options definition.
options!("/users")
+options!("/users", query: [scope: "admin"])
+options!(client, "/users")
+options!(client, "/users", query: [scope: "admin"])
+options!(client, "/users", body: %{name: "Jon"})
@@ -1393,10 +1393,10 @@ patch(client, url, body, opts)
-Perform a PATCH request.
See request/1
or request/2
for options definition.
patch("/users", %{name: "Jon"})
-patch("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch(client, "/users", %{name: "Jon"})
-patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PATCH request.
See request/1
or request/2
for options definition.
patch("/users", %{name: "Jon"})
+patch("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch(client, "/users", %{name: "Jon"})
+patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1425,10 +1425,10 @@ patch!(client, url, body, opts)
-Perform a PATCH request.
See request!/1
or request!/2
for options definition.
patch!("/users", %{name: "Jon"})
-patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch!(client, "/users", %{name: "Jon"})
-patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PATCH request.
See request!/1
or request!/2
for options definition.
patch!("/users", %{name: "Jon"})
+patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch!(client, "/users", %{name: "Jon"})
+patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1457,10 +1457,10 @@ post(client, url, body, opts)
-Perform a POST request.
See request/1
or request/2
for options definition.
post("/users", %{name: "Jon"})
-post("/users", %{name: "Jon"}, query: [scope: "admin"])
-post(client, "/users", %{name: "Jon"})
-post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a POST request.
See request/1
or request/2
for options definition.
post("/users", %{name: "Jon"})
+post("/users", %{name: "Jon"}, query: [scope: "admin"])
+post(client, "/users", %{name: "Jon"})
+post(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1489,10 +1489,10 @@ post!(client, url, body, opts)
-Perform a POST request.
See request!/1
or request!/2
for options definition.
post!("/users", %{name: "Jon"})
-post!("/users", %{name: "Jon"}, query: [scope: "admin"])
-post!(client, "/users", %{name: "Jon"})
-post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a POST request.
See request!/1
or request!/2
for options definition.
post!("/users", %{name: "Jon"})
+post!("/users", %{name: "Jon"}, query: [scope: "admin"])
+post!(client, "/users", %{name: "Jon"})
+post!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1521,10 +1521,10 @@ put(client, url, body, opts)
-Perform a PUT request.
See request/1
or request/2
for options definition.
put("/users", %{name: "Jon"})
-put("/users", %{name: "Jon"}, query: [scope: "admin"])
-put(client, "/users", %{name: "Jon"})
-put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PUT request.
See request/1
or request/2
for options definition.
put("/users", %{name: "Jon"})
+put("/users", %{name: "Jon"}, query: [scope: "admin"])
+put(client, "/users", %{name: "Jon"})
+put(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1553,10 +1553,10 @@ put!(client, url, body, opts)
-Perform a PUT request.
See request!/1
or request!/2
for options definition.
put!("/users", %{name: "Jon"})
-put!("/users", %{name: "Jon"}, query: [scope: "admin"])
-put!(client, "/users", %{name: "Jon"})
-put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PUT request.
See request!/1
or request!/2
for options definition.
put!("/users", %{name: "Jon"})
+put!("/users", %{name: "Jon"}, query: [scope: "admin"])
+put!(client, "/users", %{name: "Jon"})
+put!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -1598,11 +1598,11 @@ request(client \\ %Tesla.Client{}, options)
Examples
-ExampleApi.request(method: :get, url: "/users/path")
+ExampleApi.request(method: :get, url: "/users/path")
# use shortcut methods
-ExampleApi.get("/users/1")
-ExampleApi.post(client, "/users", %{name: "Jon"})
+ExampleApi.get("/users/1")
+ExampleApi.post(client, "/users", %{name: "Jon"})
@@ -1660,11 +1660,11 @@ trace(client, url, opts)
-Perform a TRACE request.
See request/1
or request/2
for options definition.
trace("/users")
-trace("/users", query: [scope: "admin"])
-trace(client, "/users")
-trace(client, "/users", query: [scope: "admin"])
-trace(client, "/users", body: %{name: "Jon"})
+Perform a TRACE request.
See request/1
or request/2
for options definition.
trace("/users")
+trace("/users", query: [scope: "admin"])
+trace(client, "/users")
+trace(client, "/users", query: [scope: "admin"])
+trace(client, "/users", body: %{name: "Jon"})
@@ -1693,11 +1693,11 @@ trace!(client, url, opts)
-Perform a TRACE request.
See request!/1
or request!/2
for options definition.
trace!("/users")
-trace!("/users", query: [scope: "admin"])
-trace!(client, "/users")
-trace!(client, "/users", query: [scope: "admin"])
-trace!(client, "/users", body: %{name: "Jon"})
+Perform a TRACE request.
See request!/1
or request!/2
for options definition.
trace!("/users")
+trace!("/users", query: [scope: "admin"])
+trace!(client, "/users")
+trace!(client, "/users", query: [scope: "admin"])
+trace!(client, "/users", body: %{name: "Jon"})
diff --git a/Lightning.WebhookAuthMethods.html b/Lightning.WebhookAuthMethods.html
index 128e46b562..6f7a3a2e18 100644
--- a/Lightning.WebhookAuthMethods.html
+++ b/Lightning.WebhookAuthMethods.html
@@ -347,15 +347,15 @@ create_auth_method(attrs, list)
Examples
-Creating a WebhookAuthMethod
without an associated trigger:
iex> create_auth_method(%{valid_attributes}, actor: %User{})
-{:ok, %WebhookAuthMethod{}}
+Creating a WebhookAuthMethod
without an associated trigger:
iex> create_auth_method(%{valid_attributes}, actor: %User{})
+{:ok, %WebhookAuthMethod{}}
-iex> create_auth_method(%{invalid_attributes}, actor: %User{})
-{:error, %Ecto.Changeset{}}
Creating a WebhookAuthMethod
with an associated trigger:
iex> create_auth_method(%Trigger{}, %{valid_attributes}, actor: %User{})
-{:ok, %WebhookAuthMethod{}}
+iex> create_auth_method(%{invalid_attributes}, actor: %User{})
+{:error, %Ecto.Changeset{}}
Creating a WebhookAuthMethod
with an associated trigger:
iex> create_auth_method(%Trigger{}, %{valid_attributes}, actor: %User{})
+{:ok, %WebhookAuthMethod{}}
-iex> create_auth_method(%Trigger{}, %{invalid_attributes}, actor: %User{})
-{:error, %Ecto.Changeset{}}
+
iex> create_auth_method(%Trigger{}, %{invalid_attributes}, actor: %User{})
+{:error, %Ecto.Changeset{}}
@@ -440,9 +440,9 @@ create_changeset(webhook_auth_method, param
Examples
-Creating a changeset for an API type auth method:
iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :api}, %{})
-%WebhookAuthMethod{api_key: some_new_api_key}
Creating a changeset for a non-API type auth method:
iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :other}, %{})
-%WebhookAuthMethod{}
+Creating a changeset for an API type auth method:
iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :api}, %{})
+%WebhookAuthMethod{api_key: some_new_api_key}
Creating a changeset for a non-API type auth method:
iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :other}, %{})
+%WebhookAuthMethod{}
@@ -490,9 +490,9 @@ delete_auth_method(auth_method)
Examples
-Successful deletion:
iex> delete_auth_method(%WebhookAuthMethod{id: "some_id"})
-{:ok, %WebhookAuthMethod{}}
Deletion fails due to the item not existing or other conflict:
iex> delete_auth_method(%WebhookAuthMethod{id: "non_existing_id"})
-{:error, reason}
+Successful deletion:
iex> delete_auth_method(%WebhookAuthMethod{id: "some_id"})
+{:ok, %WebhookAuthMethod{}}
Deletion fails due to the item not existing or other conflict:
iex> delete_auth_method(%WebhookAuthMethod{id: "non_existing_id"})
+{:error, reason}
@@ -545,8 +545,8 @@ find_by_api_key(api_key, project)
Examples
-When a matching WebhookAuthMethod
is found:
iex> Lightning.Workflows.find_by_api_key("existing_api_key", %Project{id: "existing_project_id"})
-%WebhookAuthMethod{}
When there is no matching WebhookAuthMethod
:
iex> Lightning.Workflows.find_by_api_key("non_existing_api_key", %Project{id: "existing_project_id"})
+When a matching WebhookAuthMethod
is found:
iex> Lightning.Workflows.find_by_api_key("existing_api_key", %Project{id: "existing_project_id"})
+%WebhookAuthMethod{}
When there is no matching WebhookAuthMethod
:
iex> Lightning.Workflows.find_by_api_key("non_existing_api_key", %Project{id: "existing_project_id"})
nil
@@ -599,8 +599,8 @@ find_by_id!(id)
Examples
-When a WebhookAuthMethod
with the given ID exists:
iex> Lightning.Workflows.find_by_id!("existing_id")
-%WebhookAuthMethod{}
When there is no WebhookAuthMethod
with the given ID:
iex> Lightning.Workflows.find_by_id!("non_existing_id")
+When a WebhookAuthMethod
with the given ID exists:
iex> Lightning.Workflows.find_by_id!("existing_id")
+%WebhookAuthMethod{}
When there is no WebhookAuthMethod
with the given ID:
iex> Lightning.Workflows.find_by_id!("non_existing_id")
** (Ecto.NoResultsError)
@@ -652,8 +652,8 @@ find_by_username_and_password(username, pas
Examples
-When a matching WebhookAuthMethod
is found and the password is valid:
iex> Lightning.Workflows.find_by_username_and_password("existing_username", "valid_password", %Project{id: "existing_project_id"})
-%WebhookAuthMethod{}
When the username is found but the password is invalid or no matching record is found:
iex> Lightning.Workflows.find_by_username_and_password("existing_username", "invalid_password", %Project{id: "existing_project_id"})
+When a matching WebhookAuthMethod
is found and the password is valid:
iex> Lightning.Workflows.find_by_username_and_password("existing_username", "valid_password", %Project{id: "existing_project_id"})
+%WebhookAuthMethod{}
When the username is found but the password is invalid or no matching record is found:
iex> Lightning.Workflows.find_by_username_and_password("existing_username", "invalid_password", %Project{id: "existing_project_id"})
nil
@@ -702,9 +702,9 @@ list_for_project(project)
Examples
-When the project exists and has associated auth methods:
iex> list_for_project(%Project{id: "existing_project_id"})
-[%WebhookAuthMethod{}, ...]
When the project does not exist or has no associated auth methods:
iex> list_for_project(%Project{id: "non_existing_project_id"})
-[]
+When the project exists and has associated auth methods:
iex> list_for_project(%Project{id: "existing_project_id"})
+[%WebhookAuthMethod{}, ...]
When the project does not exist or has no associated auth methods:
iex> list_for_project(%Project{id: "non_existing_project_id"})
+[]
@@ -752,9 +752,9 @@ list_for_trigger(trigger)
Examples
-When the Trigger
has associated WebhookAuthMethod
s not scheduled for deletion:
iex> Lightning.Workflows.list_for_trigger(%Trigger{id: "existing_trigger_id"})
-[%WebhookAuthMethod{}, ...]
When the Trigger
has no associated WebhookAuthMethod
s or they are all scheduled for deletion:
iex> Lightning.Workflows.list_for_trigger(%Trigger{id: "trigger_without_methods"})
-[]
+When the Trigger
has associated WebhookAuthMethod
s not scheduled for deletion:
iex> Lightning.Workflows.list_for_trigger(%Trigger{id: "existing_trigger_id"})
+[%WebhookAuthMethod{}, ...]
When the Trigger
has no associated WebhookAuthMethod
s or they are all scheduled for deletion:
iex> Lightning.Workflows.list_for_trigger(%Trigger{id: "trigger_without_methods"})
+[]
@@ -864,9 +864,9 @@ schedule_for_deletion(webhook_auth_method,
Examples
-When a webhook auth method is successfully scheduled for deletion:
iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{id: some_id})
-{:ok, %WebhookAuthMethod{scheduled_deletion: deletion_date}}
When scheduling for deletion fails due to validation errors:
iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{})
-{:error, %Ecto.Changeset{}}
+When a webhook auth method is successfully scheduled for deletion:
iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{id: some_id})
+{:ok, %WebhookAuthMethod{scheduled_deletion: deletion_date}}
When scheduling for deletion fails due to validation errors:
iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{})
+{:error, %Ecto.Changeset{}}
@@ -916,9 +916,9 @@ update_auth_method(webhook_auth_method, att
Examples
-Successful update:
iex> update_auth_method(webhook_auth_method, %{field: new_value}, actor: %User{})
-{:ok, %WebhookAuthMethod{}}
Update fails due to invalid data:
iex> update_auth_method(webhook_auth_method, %{field: bad_value}, actor: %User{})
-{:error, %Ecto.Changeset{}}
+Successful update:
iex> update_auth_method(webhook_auth_method, %{field: new_value}, actor: %User{})
+{:ok, %WebhookAuthMethod{}}
Update fails due to invalid data:
iex> update_auth_method(webhook_auth_method, %{field: bad_value}, actor: %User{})
+{:error, %Ecto.Changeset{}}
@@ -974,9 +974,9 @@ update_trigger_auth_methods(trigger, auth_m
Examples
-Successful association update:
iex> update_trigger_auth_methods(trigger, [webhook_auth_method], actor: %User{})
-{:ok, %Trigger{}}
Update fails due to an invalid changeset:
iex> update_trigger_auth_methods(trigger, [invalid_webhook_auth_method], actor: %User{})
-{:error, %Ecto.Changeset{}}
+Successful association update:
iex> update_trigger_auth_methods(trigger, [webhook_auth_method], actor: %User{})
+{:ok, %Trigger{}}
Update fails due to an invalid changeset:
iex> update_trigger_auth_methods(trigger, [invalid_webhook_auth_method], actor: %User{})
+{:error, %Ecto.Changeset{}}
diff --git a/Lightning.WorkOrders.ExportWorker.html b/Lightning.WorkOrders.ExportWorker.html
index dabc9336e9..fd3aa02a3a 100644
--- a/Lightning.WorkOrders.ExportWorker.html
+++ b/Lightning.WorkOrders.ExportWorker.html
@@ -138,7 +138,7 @@
This module handles the export of work orders for a given project. The export process is performed asynchronously using the Oban background job system.
## Responsibilities
- Enqueueing Export Jobs: The
enqueue_export/2
function creates and enqueues an Oban job for exporting work orders based on the given project and search parameters. - Processing Exports: The
perform/1
function is the main entry point for executing the export job. It retrieves the project, processes work orders, and handles the export process. - Export Logic: The export logic involves querying work orders, extracting relevant entities, processing logs and dataclips asynchronously, and writing the final export data to files.
- Error Handling: The module includes comprehensive error handling and logging to ensure that issues during the export process are recorded and can be diagnosed.
- Zip File Creation: After processing, the exported files are compressed into a zip file for easy download or further use.
## Usage
- To enqueue an export job, call
enqueue_export/2
with the project and search parameters. - The export process is triggered by Oban and runs in the
history_exports
queue, limited to a single attempt per job.
## Example
# Enqueue an export job
- Lightning.WorkOrders.ExportWorker.enqueue_export(project, search_params)
+ Lightning.WorkOrders.ExportWorker.enqueue_export(project, search_params)
# The job will run in the background and log the status of the export process.
This module is designed to handle potentially large datasets efficiently by using streaming, async processing, and error recovery mechanisms.
diff --git a/Lightning.WorkOrders.html b/Lightning.WorkOrders.html
index 707ea849cf..fc0728ec02 100644
--- a/Lightning.WorkOrders.html
+++ b/Lightning.WorkOrders.html
@@ -451,7 +451,7 @@ create_for(target, multi \\ Multi.new(), op
-
Create a new Work Order.
For a webhook
create_for(trigger, workflow: workflow, dataclip: dataclip)
For a user
create_for(job, workflow: workflow, dataclip: dataclip, user: user)
+Create a new Work Order.
For a webhook
create_for(trigger, workflow: workflow, dataclip: dataclip)
For a user
create_for(job, workflow: workflow, dataclip: dataclip, user: user)
@@ -503,7 +503,7 @@ get(id, opts \\ [])
-Get a Work Order by id.
Optionally preload associations by passing a list of atoms to :include
.
Lightning.WorkOrders.get(id, include: [:runs])
+Get a Work Order by id.
Optionally preload associations by passing a list of atoms to :include
.
Lightning.WorkOrders.get(id, include: [:runs])
diff --git a/Lightning.Workflows.Job.html b/Lightning.Workflows.Job.html
index 459b612335..427d3bf177 100644
--- a/Lightning.Workflows.Job.html
+++ b/Lightning.Workflows.Job.html
@@ -356,17 +356,17 @@ put_workflow(changeset, workflow)
Attaches a workflow to a job, this is useful when you have an unpersisted
Workflow changeset - and want it to be created at the same time as a Job.
Example:
workflow =
- Ecto.Changeset.cast(
- %Lightning.Workflows.Workflow{},
- %{ "project_id" => attrs[:project_id], "id" => Ecto.UUID.generate() },
- [:project_id, :id]
- )
+ Ecto.Changeset.cast(
+ %Lightning.Workflows.Workflow{},
+ %{ "project_id" => attrs[:project_id], "id" => Ecto.UUID.generate() },
+ [:project_id, :id]
+ )
job =
- %Job{}
- |> Ecto.Changeset.change()
- |> Job.put_workflow(workflow)
- |> Job.changeset(attrs)
+
%Job{}
+ |> Ecto.Changeset.change()
+ |> Job.put_workflow(workflow)
+ |> Job.changeset(attrs)
diff --git a/Lightning.Workflows.Presence.html b/Lightning.Workflows.Presence.html
index d26b836daa..de720bdde3 100644
--- a/Lightning.Workflows.Presence.html
+++ b/Lightning.Workflows.Presence.html
@@ -352,27 +352,27 @@ build_presences_summary(presences, params)<
Examples
-iex> presences = [
-...> %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
-...> %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},
-...> %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}
-...> ]
-iex> params = %{
-...> current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
-...> current_user: %{id: 1},
-...> view_only_users_ids: [2]
-...> }
-iex> build_presences_summary(presences, params)
-%{
- presences: [
- %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
- %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},
- %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}
- ],
- prior_user_presence: %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1},
- current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
+iex> presences = [
+...> %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
+...> %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},
+...> %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}
+...> ]
+iex> params = %{
+...> current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
+...> current_user: %{id: 1},
+...> view_only_users_ids: [2]
+...> }
+iex> build_presences_summary(presences, params)
+%{
+ presences: [
+ %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
+ %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},
+ %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}
+ ],
+ prior_user_presence: %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1},
+ current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},
has_presence_edit_priority: true
-}
+}
@@ -516,8 +516,8 @@ list_presences(topic)
Examples
-iex> Lightning.Workflows.Presence.list_presences("workflow:canvas")
-[%Lightning.Workflows.Presence{user: %User{id: 1}, ...}, ...]
+iex> Lightning.Workflows.Presence.list_presences("workflow:canvas")
+[%Lightning.Workflows.Presence{user: %User{id: 1}, ...}, ...]
@@ -553,12 +553,12 @@ new_user_presence(user, joined_at, active_s
Examples
-iex> Lightning.Workflows.Presence.new_user_presence(%User{id: 1}, 1625597762000000)
-%Lightning.Workflows.Presence{
- user: %User{id: 1},
+iex> Lightning.Workflows.Presence.new_user_presence(%User{id: 1}, 1625597762000000)
+%Lightning.Workflows.Presence{
+ user: %User{id: 1},
joined_at: 1625597762000000,
active_sessions: 0
-}
+}
@@ -636,7 +636,7 @@ track_user_presence(user, topic, pid)
Examples
-iex> Lightning.Workflows.Presence.track_user_presence(%User{id: 1}, "room:lobby", self())
+iex> Lightning.Workflows.Presence.track_user_presence(%User{id: 1}, "room:lobby", self())
:ok
diff --git a/Lightning.Workflows.html b/Lightning.Workflows.html
index aa19297aff..e42826a0f8 100644
--- a/Lightning.Workflows.html
+++ b/Lightning.Workflows.html
@@ -444,8 +444,8 @@ change_workflow(workflow, attrs \\ %{})
Examples
-iex> change_workflow(workflow)
-%Ecto.Changeset{data: %Workflow{}}
+iex> change_workflow(workflow)
+%Ecto.Changeset{data: %Workflow{}}
@@ -507,12 +507,12 @@ get_edge_by_trigger(trigger)
Examples
-trigger = %Trigger{id: 1, ...}
-Lightning.Workflows.get_edge_by_trigger(trigger)
+trigger = %Trigger{id: 1, ...}
+Lightning.Workflows.get_edge_by_trigger(trigger)
# => %Edge{source_trigger: %Trigger{}, target_job: %Job{}, ...}
-non_existent_trigger = %Trigger{id: 999, ...}
-Lightning.Workflows.get_edge_by_trigger(non_existent_trigger)
+non_existent_trigger = %Trigger{id: 999, ...}
+Lightning.Workflows.get_edge_by_trigger(non_existent_trigger)
# => nil
@@ -582,10 +582,10 @@ get_trigger_by_webhook(path)
Examples
-Lightning.Workflows.get_trigger_by_webhook("some_path_or_id")
+Lightning.Workflows.get_trigger_by_webhook("some_path_or_id")
# => %Trigger{id: 1, custom_path: "some_path_or_id", ...}
-Lightning.Workflows.get_trigger_by_webhook("non_existent_path_or_id")
+Lightning.Workflows.get_trigger_by_webhook("non_existent_path_or_id")
# => nil
@@ -660,10 +660,10 @@ get_workflow!(id)
Examples
-iex> get_workflow!(123)
-%Workflow{}
+iex> get_workflow!(123)
+%Workflow{}
-iex> get_workflow!(456)
+iex> get_workflow!(456)
** (Ecto.NoResultsError)
@@ -767,8 +767,8 @@ list_workflows()
Examples
-iex> list_workflows()
-[%Workflow{}, ...]
+iex> list_workflows()
+[%Workflow{}, ...]
@@ -798,8 +798,8 @@ mark_for_deletion(workflow, attrs \\ %{})
Examples
-iex> change_request_deletion(workflow)
-%Ecto.Changeset{data: %Workflow{}}
+iex> change_request_deletion(workflow)
+%Ecto.Changeset{data: %Workflow{}}
diff --git a/Lightning.epub b/Lightning.epub
index 216eba0adb..1694f36521 100644
Binary files a/Lightning.epub and b/Lightning.epub differ
diff --git a/LightningWeb.AccountConfirmationModal.html b/LightningWeb.AccountConfirmationModal.html
index eb7f8ff069..0a25438076 100644
--- a/LightningWeb.AccountConfirmationModal.html
+++ b/LightningWeb.AccountConfirmationModal.html
@@ -161,9 +161,9 @@
Examples
<.live_component
- module={LightningWeb.AccountConfirmationModal}
+ module={LightningWeb.AccountConfirmationModal}
id="account-confirmation-modal"
- current_user={@current_user}
+ current_user={@current_user}
/>
The component uses assigns to manage its state, including:
:show_modal
- Determines if the modal should be visible.:email_sent
- Indicates if the confirmation email was successfully sent.
diff --git a/LightningWeb.Components.NewInputs.html b/LightningWeb.Components.NewInputs.html
index 38f8ca8ee8..12cec6a631 100644
--- a/LightningWeb.Components.NewInputs.html
+++ b/LightningWeb.Components.NewInputs.html
@@ -358,8 +358,8 @@ input(assigns)
Examples
-<.input field={@form[:email]} type="email" />
-<.input name="my-input" errors={["oh no!"]} />
+<.input field={@form[:email]} type="email" />
+<.input name="my-input" errors={["oh no!"]} />
diff --git a/LightningWeb.Components.Viewers.html b/LightningWeb.Components.Viewers.html
index 946eb2d8e4..819032af24 100644
--- a/LightningWeb.Components.Viewers.html
+++ b/LightningWeb.Components.Viewers.html
@@ -265,8 +265,8 @@ log_viewer(assigns)
<Viewers.log_viewer
id="log-viewer-data"
- stream={@log_lines}
- highlight_id={@selected_step_id}
+ stream={@log_lines}
+ highlight_id={@selected_step_id}
/>
diff --git a/LightningWeb.Gettext.html b/LightningWeb.Gettext.html
index 44db26f2a3..bf203b1c36 100644
--- a/LightningWeb.Gettext.html
+++ b/LightningWeb.Gettext.html
@@ -141,15 +141,15 @@
your module gains a set of macros for translations, for example:import LightningWeb.Gettext
# Simple translation
-gettext("Here is the string to translate")
+gettext("Here is the string to translate")
# Plural translation
-ngettext("Here is the string to translate",
+ngettext("Here is the string to translate",
"Here are the strings to translate",
- 3)
+ 3)
# Domain-based translation
-dgettext("errors", "Here is the error message to translate")
See the Gettext Docs for detailed usage.
+
dgettext("errors", "Here is the error message to translate")
See the Gettext Docs for detailed usage.
diff --git a/LightningWeb.OauthCredentialHelper.html b/LightningWeb.OauthCredentialHelper.html
index 3840560717..b33bf96a02 100644
--- a/LightningWeb.OauthCredentialHelper.html
+++ b/LightningWeb.OauthCredentialHelper.html
@@ -261,10 +261,10 @@ broadcast_forward(subscription_id, mod, opt
Broadcast a message specifically for forwarding a message to a component.
It expects a subscription_id
, the module of the component and opts
being a keyword list containing an :id
key of the specific component.
See: Phoenix.LiveView.send_update/3
for more info.
A corresponding LiveView (that is subscribed) is expected to have a matching
-handle_info/2
that looks like this:
def handle_info({:forward, mod, opts}, socket) do
- send_update(mod, opts)
- {:noreply, socket}
-end
+handle_info/2
that looks like this:def handle_info({:forward, mod, opts}, socket) do
+ send_update(mod, opts)
+ {:noreply, socket}
+end
diff --git a/LightningWeb.Pagination.html b/LightningWeb.Pagination.html
index d66b26cf82..28cffafc76 100644
--- a/LightningWeb.Pagination.html
+++ b/LightningWeb.Pagination.html
@@ -278,13 +278,13 @@ raw_pagination_links(paginator, options \\
Returns the raw data in order to generate the proper HTML for pagination links. Data
is returned in a {text, page_number}
format where text
is intended to be the text
of the link and page_number
is the page it should go to. Defaults are already supplied
-and they are as follows:
[distance: 5, next: :next, previous: :previous, first: true, last: true, ellipsis: :ellipsis]
distance
must be a positive non-zero integer or an exception is raised. next
and previous
should be
+and they are as follows:
[distance: 5, next: :next, previous: :previous, first: true, last: true, ellipsis: :ellipsis]
distance
must be a positive non-zero integer or an exception is raised. next
and previous
should be
strings but can be anything you want as long as it is truthy, falsey values will remove
them from the output. first
and last
are only booleans, and they just include/remove
-their respective link from output. An example of the data returned:
iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 10, page_number: 5})
-[{"<<", 4}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}, {7, 7}, {8, 8}, {9, 9}, {10, 10}, {">>", 6}]
-iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 20, page_number: 10}, first: ["←"], last: ["→"])
-[{"<<", 9}, {["←"], 1}, {:ellipsis, {:safe, "…"}}, {5, 5}, {6, 6},{7, 7}, {8, 8}, {9, 9}, {10, 10}, {11, 11}, {12, 12}, {13, 13}, {14, 14},{15, 15}, {:ellipsis, {:safe, "…"}}, {["→"], 20}, {">>", 11}]
Simply loop and pattern match over each item and transform it to your custom HTML.
+their respective link from output. An example of the data returned:iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 10, page_number: 5})
+[{"<<", 4}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6}, {7, 7}, {8, 8}, {9, 9}, {10, 10}, {">>", 6}]
+iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 20, page_number: 10}, first: ["←"], last: ["→"])
+[{"<<", 9}, {["←"], 1}, {:ellipsis, {:safe, "…"}}, {5, 5}, {6, 6},{7, 7}, {8, 8}, {9, 9}, {10, 10}, {11, 11}, {12, 12}, {13, 13}, {14, 14},{15, 15}, {:ellipsis, {:safe, "…"}}, {["→"], 20}, {">>", 11}]
Simply loop and pattern match over each item and transform it to your custom HTML.
diff --git a/LightningWeb.Plugs.Redirect.html b/LightningWeb.Plugs.Redirect.html
index 093a0096f4..f5445335ea 100644
--- a/LightningWeb.Plugs.Redirect.html
+++ b/LightningWeb.Plugs.Redirect.html
@@ -217,10 +217,10 @@ call(conn, action)
Examples
-iex> conn = %Plug.Conn{}
-iex> opts = [to: "/new_path"]
-iex> LightningWeb.Plugs.Redirect.call(conn, opts)
-%Plug.Conn{...}
+iex> conn = %Plug.Conn{}
+iex> opts = [to: "/new_path"]
+iex> LightningWeb.Plugs.Redirect.call(conn, opts)
+%Plug.Conn{...}
@@ -266,8 +266,8 @@ init(opts)
Examples
-iex> LightningWeb.Plugs.Redirect.init(to: "/new_path")
-[to: "/new_path"]
+iex> LightningWeb.Plugs.Redirect.init(to: "/new_path")
+[to: "/new_path"]
diff --git a/LightningWeb.Plugs.WebhookAuth.html b/LightningWeb.Plugs.WebhookAuth.html
index 6d36d9d000..6989fbaabe 100644
--- a/LightningWeb.Plugs.WebhookAuth.html
+++ b/LightningWeb.Plugs.WebhookAuth.html
@@ -247,11 +247,11 @@ call(conn, action)
Webhook Found and Authenticated
-iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])
-%Plug.Conn{status: 200, ...}
+iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])
+%Plug.Conn{status: 200, ...}
-iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])
-%Plug.Conn{status: 404, ...}
+iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])
+%Plug.Conn{status: 404, ...}
diff --git a/LightningWeb.Telemetry.html b/LightningWeb.Telemetry.html
index 7494ddf10f..a012114740 100644
--- a/LightningWeb.Telemetry.html
+++ b/LightningWeb.Telemetry.html
@@ -301,10 +301,10 @@ with_span(prefix, metadata, func)
Convenience function that wraps :telemetry.span/3
.
Given a function with an arity of zero, it passes the metadata
argument
out with the result of the function.
If you need to control the metadata
, pass in a function with an arity of
one. It will be called with the metadata provided and expects the result and
-the updated metadata to be returned in a tuple.
Example:
with_span([:my, span], %{project_id: 123}, fn -> get_project(456) end)
Or when you want to extend the metadata:
with_span([:my, :span], %{user_id: 123}, fn _metadata ->
- project = get_project(456)
- {project, %{project_id: project.id}}
-end)
+the updated metadata to be returned in a tuple.Example:
with_span([:my, span], %{project_id: 123}, fn -> get_project(456) end)
Or when you want to extend the metadata:
with_span([:my, :span], %{user_id: 123}, fn _metadata ->
+ project = get_project(456)
+ {project, %{project_id: project.id}}
+end)
diff --git a/Mix.Tasks.Lightning.InstallAdaptorIcons.html b/Mix.Tasks.Lightning.InstallAdaptorIcons.html
index bf76128767..efefa6664f 100644
--- a/Mix.Tasks.Lightning.InstallAdaptorIcons.html
+++ b/Mix.Tasks.Lightning.InstallAdaptorIcons.html
@@ -373,11 +373,11 @@ get(client, url, opts)
-
Perform a GET request.
See request/1
or request/2
for options definition.
get("/users")
-get("/users", query: [scope: "admin"])
-get(client, "/users")
-get(client, "/users", query: [scope: "admin"])
-get(client, "/users", body: %{name: "Jon"})
+Perform a GET request.
See request/1
or request/2
for options definition.
get("/users")
+get("/users", query: [scope: "admin"])
+get(client, "/users")
+get(client, "/users", query: [scope: "admin"])
+get(client, "/users", body: %{name: "Jon"})
@@ -406,11 +406,11 @@ get!(client, url, opts)
-Perform a GET request.
See request!/1
or request!/2
for options definition.
get!("/users")
-get!("/users", query: [scope: "admin"])
-get!(client, "/users")
-get!(client, "/users", query: [scope: "admin"])
-get!(client, "/users", body: %{name: "Jon"})
+Perform a GET request.
See request!/1
or request!/2
for options definition.
get!("/users")
+get!("/users", query: [scope: "admin"])
+get!(client, "/users")
+get!(client, "/users", query: [scope: "admin"])
+get!(client, "/users", body: %{name: "Jon"})
@@ -438,11 +438,11 @@ head(client, url, opts)
-Perform a HEAD request.
See request/1
or request/2
for options definition.
head("/users")
-head("/users", query: [scope: "admin"])
-head(client, "/users")
-head(client, "/users", query: [scope: "admin"])
-head(client, "/users", body: %{name: "Jon"})
+Perform a HEAD request.
See request/1
or request/2
for options definition.
head("/users")
+head("/users", query: [scope: "admin"])
+head(client, "/users")
+head(client, "/users", query: [scope: "admin"])
+head(client, "/users", body: %{name: "Jon"})
@@ -471,11 +471,11 @@ head!(client, url, opts)
-Perform a HEAD request.
See request!/1
or request!/2
for options definition.
head!("/users")
-head!("/users", query: [scope: "admin"])
-head!(client, "/users")
-head!(client, "/users", query: [scope: "admin"])
-head!(client, "/users", body: %{name: "Jon"})
+Perform a HEAD request.
See request!/1
or request!/2
for options definition.
head!("/users")
+head!("/users", query: [scope: "admin"])
+head!(client, "/users")
+head!(client, "/users", query: [scope: "admin"])
+head!(client, "/users", body: %{name: "Jon"})
@@ -503,11 +503,11 @@ options(client, url, opts)
-Perform a OPTIONS request.
See request/1
or request/2
for options definition.
options("/users")
-options("/users", query: [scope: "admin"])
-options(client, "/users")
-options(client, "/users", query: [scope: "admin"])
-options(client, "/users", body: %{name: "Jon"})
+Perform a OPTIONS request.
See request/1
or request/2
for options definition.
options("/users")
+options("/users", query: [scope: "admin"])
+options(client, "/users")
+options(client, "/users", query: [scope: "admin"])
+options(client, "/users", body: %{name: "Jon"})
@@ -536,11 +536,11 @@ options!(client, url, opts)
-Perform a OPTIONS request.
See request!/1
or request!/2
for options definition.
options!("/users")
-options!("/users", query: [scope: "admin"])
-options!(client, "/users")
-options!(client, "/users", query: [scope: "admin"])
-options!(client, "/users", body: %{name: "Jon"})
+Perform a OPTIONS request.
See request!/1
or request!/2
for options definition.
options!("/users")
+options!("/users", query: [scope: "admin"])
+options!(client, "/users")
+options!(client, "/users", query: [scope: "admin"])
+options!(client, "/users", body: %{name: "Jon"})
@@ -569,10 +569,10 @@ patch(client, url, body, opts)
-Perform a PATCH request.
See request/1
or request/2
for options definition.
patch("/users", %{name: "Jon"})
-patch("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch(client, "/users", %{name: "Jon"})
-patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PATCH request.
See request/1
or request/2
for options definition.
patch("/users", %{name: "Jon"})
+patch("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch(client, "/users", %{name: "Jon"})
+patch(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -601,10 +601,10 @@ patch!(client, url, body, opts)
-Perform a PATCH request.
See request!/1
or request!/2
for options definition.
patch!("/users", %{name: "Jon"})
-patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
-patch!(client, "/users", %{name: "Jon"})
-patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
+Perform a PATCH request.
See request!/1
or request!/2
for options definition.
patch!("/users", %{name: "Jon"})
+patch!("/users", %{name: "Jon"}, query: [scope: "admin"])
+patch!(client, "/users", %{name: "Jon"})
+patch!(client, "/users", %{name: "Jon"}, query: [scope: "admin"])
@@ -646,11 +646,11 @@ request(client \\ %Tesla.Client{}, options)
Examples
-ExampleApi.request(method: :get, url: "/users/path")
+ExampleApi.request(method: :get, url: "/users/path")
# use shortcut methods
-ExampleApi.get("/users/1")
-ExampleApi.post(client, "/users", %{name: "Jon"})
+ExampleApi.get("/users/1")
+ExampleApi.post(client, "/users", %{name: "Jon"})
@@ -708,11 +708,11 @@ trace(client, url, opts)
-Perform a TRACE request.
See request/1
or request/2
for options definition.
trace("/users")
-trace("/users", query: [scope: "admin"])
-trace(client, "/users")
-trace(client, "/users", query: [scope: "admin"])
-trace(client, "/users", body: %{name: "Jon"})
+Perform a TRACE request.
See request/1
or request/2
for options definition.
trace("/users")
+trace("/users", query: [scope: "admin"])
+trace(client, "/users")
+trace(client, "/users", query: [scope: "admin"])
+trace(client, "/users", body: %{name: "Jon"})
@@ -741,11 +741,11 @@ trace!(client, url, opts)
-Perform a TRACE request.
See request!/1
or request!/2
for options definition.
trace!("/users")
-trace!("/users", query: [scope: "admin"])
-trace!(client, "/users")
-trace!(client, "/users", query: [scope: "admin"])
-trace!(client, "/users", body: %{name: "Jon"})
+Perform a TRACE request.
See request!/1
or request!/2
for options definition.
trace!("/users")
+trace!("/users", query: [scope: "admin"])
+trace!(client, "/users")
+trace!(client, "/users", query: [scope: "admin"])
+trace!(client, "/users", body: %{name: "Jon"})
diff --git a/Mix.Tasks.Lightning.InstallSchemas.html b/Mix.Tasks.Lightning.InstallSchemas.html
index 7cbd20d891..e63b2f223d 100644
--- a/Mix.Tasks.Lightning.InstallSchemas.html
+++ b/Mix.Tasks.Lightning.InstallSchemas.html
@@ -1828,14 +1828,14 @@ request(request)
Examples
-request = %HTTPoison.Request{
+request = %HTTPoison.Request{
method: :post,
url: "https://my.website.com",
body: "{\"foo\": 3}",
- headers: [{"Accept", "application/json"}]
-}
+ headers: [{"Accept", "application/json"}]
+}
-request(request)
+request(request)
@@ -1893,7 +1893,7 @@ request(method, url, body \\ "",
Examples
-request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
+request(:post, "https://my.website.com", "{\"foo\": 3}", [{"Accept", "application/json"}])
diff --git a/benchmarking.md.html b/benchmarking.md.html
index 0f7e0d3987..130234f868 100644
--- a/benchmarking.md.html
+++ b/benchmarking.md.html
@@ -145,12 +145,12 @@
Start up a local Lightning instance with an attached iex session. Note that
to simulate a production environment, set RTM=false
. In prod, you'll have
your ws-worker
running on a separate machine:
RMT=false iex -S mix phx.server
In the attached iex session, run the following, to have Lightning log
-internal telemetry data:
filepath = Path.join("benchmarking", "load_test_data.csv")
- output_file = File.open!(filepath, [:append])
+internal telemetry data: filepath = Path.join("benchmarking", "load_test_data.csv")
+ output_file = File.open!(filepath, [:append])
c "benchmarking/load_test_production_spans.exs"
- LoadTestingPrep.init(output_file)
Run the demo setup script: mix run --no-start priv/repo/demo.exs
The
+
LoadTestingPrep.init(output_file)
Run the demo setup script: mix run --no-start priv/repo/demo.exs
The
webhookURL
is already set to default to the webhook created in the demo
data
If you would like to point at a different instance or webhook url you
can provide it via WEBHOOK_URL
.
In another terminal (do not stop the Lightning server) run the
@@ -162,7 +162,7 @@
k6 run -e PAYLOAD_SIZE_KB=2 benchmarking/script.js
To collect the benchmarking data in a CSV file, run the previous command with
the --out filename
option.
k6 run --out csv=test_results.csv benchmarking/script.js
-
In the iex session, close the output file:
LoadTestingPrep.fin(output_file)
See results output for other
+
In the iex session, close the output file:
LoadTestingPrep.fin(output_file)
See results output for other
available output formats.
@@ -173,21 +173,21 @@ System specs on a 2020 MacBook Pro
Model Identifier: MacBookPro17,1
Model Number: Z11B000E3LL/A
Chip: Apple M1
-Total Number of Cores: 8 (4 performance and 4 efficiency)
+Total Number of Cores: 8 (4 performance and 4 efficiency)
Memory: 16 GB
Results with 50kb payloads
k6 run -e PAYLOAD_SIZE=10 benchmarking/script.js Node 18.17.1 k6 0.43.1 07:40:29
/\ |‾‾| /‾‾/ /‾‾/
/\ / \ | |/ / / /
- / \/ \ | ( / ‾‾\
- / \ | |\ \ | (‾) |
+ / \/ \ | ( / ‾‾\
+ / \ | |\ \ | (‾) |
/ __________ \ |__| \__\ \_____/ .io
execution: local
script: benchmarking/script.js
output: -
- scenarios: (100.00%) 1 scenario, 50 max VUs, 2m50s max duration (incl. graceful stop):
- * webhookRequests: Up to 50.00 iterations/s for 2m20s over 3 stages (maxVUs: 50, gracefulStop: 30s)
+ scenarios: (100.00%) 1 scenario, 50 max VUs, 2m50s max duration (incl. graceful stop):
+ * webhookRequests: Up to 50.00 iterations/s for 2m20s over 3 stages (maxVUs: 50, gracefulStop: 30s)
✓ status was 200
@@ -197,24 +197,24 @@ System specs on a 2020 MacBook Pro
checks.........................: 100.00% ✓ 5765 ✗ 0
data_received..................: 1.6 MB 12 kB/s
data_sent......................: 59 MB 421 kB/s
- http_req_blocked...............: avg=16.01µs min=2µs med=9µs max=6.84ms p(90)=12µs p(95)=13µs
- http_req_connecting............: avg=4.35µs min=0s med=0s max=2.22ms p(90)=0s p(95)=0s
- ✓ http_req_duration..............: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms
- { expected_response:true }...: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms
+ http_req_blocked...............: avg=16.01µs min=2µs med=9µs max=6.84ms p(90)=12µs p(95)=13µs
+ http_req_connecting............: avg=4.35µs min=0s med=0s max=2.22ms p(90)=0s p(95)=0s
+ ✓ http_req_duration..............: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms
+ { expected_response:true }...: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms
✓ http_req_failed................: 0.00% ✓ 0 ✗ 5765
- http_req_receiving.............: avg=88.57µs min=13µs med=90µs max=2.99ms p(90)=108µs p(95)=124.8µs
- http_req_sending...............: avg=97.47µs min=29µs med=83µs max=6.86ms p(90)=139µs p(95)=162µs
- http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
- http_req_waiting...............: avg=53.44ms min=26.68ms med=48.84ms max=501.43ms p(90)=66.43ms p(95)=84.05ms
+ http_req_receiving.............: avg=88.57µs min=13µs med=90µs max=2.99ms p(90)=108µs p(95)=124.8µs
+ http_req_sending...............: avg=97.47µs min=29µs med=83µs max=6.86ms p(90)=139µs p(95)=162µs
+ http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
+ http_req_waiting...............: avg=53.44ms min=26.68ms med=48.84ms max=501.43ms p(90)=66.43ms p(95)=84.05ms
http_reqs......................: 5765 41.15402/s
- iteration_duration.............: avg=54.34ms min=20.75µs med=49.75ms max=502.26ms p(90)=67.39ms p(95)=84.91ms
+ iteration_duration.............: avg=54.34ms min=20.75µs med=49.75ms max=502.26ms p(90)=67.39ms p(95)=84.91ms
iterations.....................: 5765 41.15402/s
vus............................: 50 min=50 max=50
vus_max........................: 50 min=50 max=50
-running (2m20.1s), 00/50 VUs, 5765 complete and 0 interrupted iterations
-webhookRequests ✓ [======================================] 00/50 VUs 2m20s 01.12 iters/s
+
running (2m20.1s), 00/50 VUs, 5765 complete and 0 interrupted iterations
+webhookRequests ✓ [======================================] 00/50 VUs 2m20s 01.12 iters/s
diff --git a/changelog.html b/changelog.html
index 6c46e032fc..0640300915 100644
--- a/changelog.html
+++ b/changelog.html
@@ -166,7 +166,8 @@
- Fix Oban erros not getting logged in Sentry
#2542
- Perform data retention purging in batches to avoid timeouts
-#2528
- Mark unfinished steps having finished runs as
lost
+#2528 - Fix editor panel title gets pushed away when collapsed
+#2545
- Mark unfinished steps having finished runs as
lost
#2416
@@ -359,20 +360,20 @@
In order to fix this, you will need to manually create new snapshots for
each of your workflows. This can be done either by modifying the workflow in
the UI and saving it. Or running a command on the running instance:alias Lightning.Repo
-alias Lightning.Workflows.{Workflow, Snapshot}
+alias Lightning.Workflows.{Workflow, Snapshot}
-Repo.transaction(fn ->
+Repo.transaction(fn ->
snapshots =
- Repo.all(Workflow)
- |> Enum.map(&Workflow.touch/1)
- |> Enum.map(&Repo.update!/1)
- |> Enum.map(fn workflow ->
- {:ok, snapshot} = Snapshot.create(workflow)
+ Repo.all(Workflow)
+ |> Enum.map(&Workflow.touch/1)
+ |> Enum.map(&Repo.update!/1)
+ |> Enum.map(fn workflow ->
+ {:ok, snapshot} = Snapshot.create(workflow)
snapshot
- end)
+ end)
- {:ok, snapshots}
-end)
+ {:ok, snapshots}
+end)
@@ -2405,7 +2406,7 @@
will be less than v0.10.0
and the final states are not guaranteed to be
accurate for workflows with multiple branches and leaf nodes with varying exit
reasons.
The migration scripts can be run with a single function call in SetupUtils from
-a connect iex
session:
Lightning.SetupUtils.approximate_state_for_attempts_and_workorders()
Note that (like lots of other functionality in SetupUtils
, calling this
+a connect iex
session:
Lightning.SetupUtils.approximate_state_for_attempts_and_workorders()
Note that (like lots of other functionality in SetupUtils
, calling this
function is a destructive action and you should only do it if you've backed up
your data and you know what you're doing.)
As always, we recommend backing up your data before migrating. (And thanks for
bearing with us as we move towards our first stable Lightning release.)
diff --git a/dist/search_data-47870F19.js b/dist/search_data-09F44865.js
similarity index 82%
rename from dist/search_data-47870F19.js
rename to dist/search_data-09F44865.js
index da6f62f75d..f7ef79667d 100644
--- a/dist/search_data-47870F19.js
+++ b/dist/search_data-09F44865.js
@@ -1 +1 @@
-searchData={"items":[{"type":"behaviour","title":"Lightning","doc":"Lightning keeps the contexts that define your domain\nand business logic.\n\nContexts are also responsible for managing your data, regardless\nif it comes from the database, an external API or others.","ref":"Lightning.html"},{"type":"function","title":"Lightning.broadcast/2","doc":"","ref":"Lightning.html#broadcast/2"},{"type":"callback","title":"Lightning.broadcast/2","doc":"","ref":"Lightning.html#c:broadcast/2"},{"type":"function","title":"Lightning.current_time/0","doc":"Returns the current time at UTC.","ref":"Lightning.html#current_time/0"},{"type":"callback","title":"Lightning.current_time/0","doc":"","ref":"Lightning.html#c:current_time/0"},{"type":"function","title":"Lightning.local_broadcast/2","doc":"","ref":"Lightning.html#local_broadcast/2"},{"type":"callback","title":"Lightning.local_broadcast/2","doc":"","ref":"Lightning.html#c:local_broadcast/2"},{"type":"function","title":"Lightning.release/0","doc":"","ref":"Lightning.html#release/0"},{"type":"callback","title":"Lightning.release/0","doc":"","ref":"Lightning.html#c:release/0"},{"type":"function","title":"Lightning.subscribe/1","doc":"","ref":"Lightning.html#subscribe/1"},{"type":"callback","title":"Lightning.subscribe/1","doc":"","ref":"Lightning.html#c:subscribe/1"},{"type":"type","title":"Lightning.release_info/0","doc":"","ref":"Lightning.html#t:release_info/0"},{"type":"module","title":"ObanPruner","doc":"The Oban Pruner removes completed Oban jobs. It leaves everything else for manual inspection.","ref":"ObanPruner.html"},{"type":"function","title":"ObanPruner.perform/1","doc":"Deletes completed Oban jobs, leaving discarded for manual inspection.","ref":"ObanPruner.html#perform/1"},{"type":"module","title":"Lightning.Accounts","doc":"The Accounts context.","ref":"Lightning.Accounts.html"},{"type":"function","title":"Lightning.Accounts.apply_user_email/3","doc":"Emulates that the email will change without actually changing\nit in the database.","ref":"Lightning.Accounts.html#apply_user_email/3"},{"type":"function","title":"Examples - Lightning.Accounts.apply_user_email/3","doc":"iex> apply_user_email(user, \"valid password\", %{email: ...})\n {:ok, %User{}}role: :superuser\n iex> apply_user_email(user, \"invalid password\", %{email: ...})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#apply_user_email/3-examples"},{"type":"function","title":"Lightning.Accounts.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Accounts.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Accounts.change_scheduled_deletion/2","doc":"Returns an `%Ecto.Changeset{}` for changing the user scheduled_deletion.","ref":"Lightning.Accounts.html#change_scheduled_deletion/2"},{"type":"function","title":"Examples - Lightning.Accounts.change_scheduled_deletion/2","doc":"iex> change_scheduled_deletion(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_scheduled_deletion/2-examples"},{"type":"function","title":"Lightning.Accounts.change_superuser_registration/1","doc":"Returns an `%Ecto.Changeset{}` for tracking superuser changes.","ref":"Lightning.Accounts.html#change_superuser_registration/1"},{"type":"function","title":"Examples - Lightning.Accounts.change_superuser_registration/1","doc":"iex> change_superuser_registration(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_superuser_registration/1-examples"},{"type":"function","title":"Lightning.Accounts.change_user/2","doc":"","ref":"Lightning.Accounts.html#change_user/2"},{"type":"function","title":"Lightning.Accounts.change_user_email/2","doc":"Returns an `%Ecto.Changeset{}` for changing the user email.","ref":"Lightning.Accounts.html#change_user_email/2"},{"type":"function","title":"Examples - Lightning.Accounts.change_user_email/2","doc":"iex> change_user_email(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_user_email/2-examples"},{"type":"function","title":"Lightning.Accounts.change_user_info/2","doc":"","ref":"Lightning.Accounts.html#change_user_info/2"},{"type":"function","title":"Lightning.Accounts.change_user_password/2","doc":"Returns an `%Ecto.Changeset{}` for changing the user password.","ref":"Lightning.Accounts.html#change_user_password/2"},{"type":"function","title":"Examples - Lightning.Accounts.change_user_password/2","doc":"iex> change_user_password(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_user_password/2-examples"},{"type":"function","title":"Lightning.Accounts.change_user_registration/1","doc":"Returns an `%Ecto.Changeset{}` for tracking user changes.","ref":"Lightning.Accounts.html#change_user_registration/1"},{"type":"function","title":"Examples - Lightning.Accounts.change_user_registration/1","doc":"iex> change_user_registration(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_user_registration/1-examples"},{"type":"function","title":"Lightning.Accounts.confirm_user/1","doc":"Confirms a user by the given token.\n\nIf the token matches, the user account is marked as confirmed\nand the token is deleted.","ref":"Lightning.Accounts.html#confirm_user/1"},{"type":"function","title":"Lightning.Accounts.confirmation_required?/1","doc":"","ref":"Lightning.Accounts.html#confirmation_required?/1"},{"type":"function","title":"Lightning.Accounts.create_user/1","doc":"","ref":"Lightning.Accounts.html#create_user/1"},{"type":"function","title":"Lightning.Accounts.delete_auth_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_auth_token/1"},{"type":"function","title":"Lightning.Accounts.delete_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_sudo_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_token/1","doc":"Deletes a token.","ref":"Lightning.Accounts.html#delete_token/1"},{"type":"function","title":"Examples - Lightning.Accounts.delete_token/1","doc":"iex> delete_token(token)\n {:ok, %UserToken{}}\n\n iex> delete_token(token)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#delete_token/1-examples"},{"type":"function","title":"Lightning.Accounts.delete_user/1","doc":"Deletes a user.","ref":"Lightning.Accounts.html#delete_user/1"},{"type":"function","title":"Examples - Lightning.Accounts.delete_user/1","doc":"iex> delete_user(user)\n {:ok, %User{}}\n\n iex> delete_user(user)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#delete_user/1-examples"},{"type":"function","title":"Lightning.Accounts.delete_user_totp/1","doc":"Deletes the given user's TOTP","ref":"Lightning.Accounts.html#delete_user_totp/1"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/1","doc":"Delivers the confirmation email instructions to the given user.","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/1"},{"type":"function","title":"Examples - Lightning.Accounts.deliver_user_confirmation_instructions/1","doc":"iex> deliver_user_confirmation_instructions(user)\n {:ok, %{to: ..., body: ...}}\n\n iex> deliver_user_confirmation_instructions(confirmed_user)\n {:error, :already_confirmed}","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/1-examples"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/2","doc":"","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.deliver_user_reset_password_instructions/2","doc":"Delivers the reset password email to the given user.","ref":"Lightning.Accounts.html#deliver_user_reset_password_instructions/2"},{"type":"function","title":"Examples - Lightning.Accounts.deliver_user_reset_password_instructions/2","doc":"iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1))\n {:ok, %{to: ..., body: ...}}","ref":"Lightning.Accounts.html#deliver_user_reset_password_instructions/2-examples"},{"type":"function","title":"Lightning.Accounts.exchange_auth_token/1","doc":"Exchanges an auth token for a session token.\n\nThe auth token is removed from the database if successful.","ref":"Lightning.Accounts.html#exchange_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_api_token/1","doc":"Generates an API token for a user.","ref":"Lightning.Accounts.html#generate_api_token/1"},{"type":"function","title":"Lightning.Accounts.generate_auth_token/1","doc":"Generates an auth token.","ref":"Lightning.Accounts.html#generate_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_sudo_session_token/1","doc":"Generates a 2FA session token.","ref":"Lightning.Accounts.html#generate_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.generate_user_session_token/1","doc":"Generates a session token.","ref":"Lightning.Accounts.html#generate_user_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_token!/1","doc":"Gets a single token.\n\nRaises `Ecto.NoResultsError` if the UserToken does not exist.","ref":"Lightning.Accounts.html#get_token!/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_token!/1","doc":"iex> get_token!(123)\n %UserToken{}\n\n iex> get_token!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_token!/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user!/1","doc":"Gets a single user.\n\nRaises `Ecto.NoResultsError` if the User does not exist.","ref":"Lightning.Accounts.html#get_user!/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_user!/1","doc":"iex> get_user!(123)\n %User{}\n\n iex> get_user!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_user!/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_api_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_api_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_auth_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_auth_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_email/1","doc":"Gets a user by email.","ref":"Lightning.Accounts.html#get_user_by_email/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_user_by_email/1","doc":"iex> get_user_by_email(\"foo@example.com\")\n %User{}\n\n iex> get_user_by_email(\"unknown@example.com\")\n nil","ref":"Lightning.Accounts.html#get_user_by_email/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_email_and_password/2","doc":"Gets a user by email and password.","ref":"Lightning.Accounts.html#get_user_by_email_and_password/2"},{"type":"function","title":"Examples - Lightning.Accounts.get_user_by_email_and_password/2","doc":"iex> get_user_by_email_and_password(\"foo@example.com\", \"correct_password\")\n %User{}\n\n iex> get_user_by_email_and_password(\"foo@example.com\", \"invalid_password\")\n nil","ref":"Lightning.Accounts.html#get_user_by_email_and_password/2-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_reset_password_token/1","doc":"Gets the user by reset password token.","ref":"Lightning.Accounts.html#get_user_by_reset_password_token/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_user_by_reset_password_token/1","doc":"iex> get_user_by_reset_password_token(\"validtoken\")\n %User{}\n\n iex> get_user_by_reset_password_token(\"invalidtoken\")\n nil","ref":"Lightning.Accounts.html#get_user_by_reset_password_token/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_session_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_totp/1","doc":"Gets a single UserTOTP if any exists.","ref":"Lightning.Accounts.html#get_user_totp/1"},{"type":"function","title":"Lightning.Accounts.get_users_to_alert_for_project/1","doc":"Gets all users to alert of workflow failure for a project","ref":"Lightning.Accounts.html#get_users_to_alert_for_project/1"},{"type":"function","title":"Lightning.Accounts.has_activity_in_projects?/1","doc":"","ref":"Lightning.Accounts.html#has_activity_in_projects?/1"},{"type":"function","title":"Lightning.Accounts.has_one_superuser?/0","doc":"Used to determine if there is at least one Superuser in the system.\nThis triggers the setup page on fresh installs.","ref":"Lightning.Accounts.html#has_one_superuser?/0"},{"type":"function","title":"Lightning.Accounts.list_api_tokens/1","doc":"Lists all user tokens","ref":"Lightning.Accounts.html#list_api_tokens/1"},{"type":"function","title":"Lightning.Accounts.list_user_backup_codes/1","doc":"Lists the user backup codes","ref":"Lightning.Accounts.html#list_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.list_users/0","doc":"Returns the list of users.","ref":"Lightning.Accounts.html#list_users/0"},{"type":"function","title":"Examples - Lightning.Accounts.list_users/0","doc":"iex> list_users()\n [%User{}, ...]","ref":"Lightning.Accounts.html#list_users/0-examples"},{"type":"function","title":"Lightning.Accounts.list_users_by_emails/1","doc":"Returns the list of users with the given emails","ref":"Lightning.Accounts.html#list_users_by_emails/1"},{"type":"function","title":"Lightning.Accounts.perform/1","doc":"Perform, when called with %{\"type\" => \"purge_deleted\"} will find users that are ready for permanent deletion and purge them.","ref":"Lightning.Accounts.html#perform/1"},{"type":"function","title":"Lightning.Accounts.purge_user/1","doc":"","ref":"Lightning.Accounts.html#purge_user/1"},{"type":"function","title":"Lightning.Accounts.regenerate_user_backup_codes/1","doc":"Regenerates the user backup codes","ref":"Lightning.Accounts.html#regenerate_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.register_superuser/1","doc":"Registers a superuser.","ref":"Lightning.Accounts.html#register_superuser/1"},{"type":"function","title":"Examples - Lightning.Accounts.register_superuser/1","doc":"iex> register_superuser(%{field: value})\n {:ok, %User{}}\n\n iex> register_superuser(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#register_superuser/1-examples"},{"type":"function","title":"Lightning.Accounts.register_user/1","doc":"Registers a user.","ref":"Lightning.Accounts.html#register_user/1"},{"type":"function","title":"Examples - Lightning.Accounts.register_user/1","doc":"iex> register_user(%{field: value})\n {:ok, %User{}}\n\n iex> register_user(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#register_user/1-examples"},{"type":"function","title":"Lightning.Accounts.remind_account_confirmation/1","doc":"","ref":"Lightning.Accounts.html#remind_account_confirmation/1"},{"type":"function","title":"Lightning.Accounts.request_email_update/2","doc":"Delivers the update email instructions to the given user.","ref":"Lightning.Accounts.html#request_email_update/2"},{"type":"function","title":"Examples - Lightning.Accounts.request_email_update/2","doc":"iex> request_email_update(user, new_email)\n :ok","ref":"Lightning.Accounts.html#request_email_update/2-examples"},{"type":"function","title":"Lightning.Accounts.reset_user_password/2","doc":"Resets the user password.","ref":"Lightning.Accounts.html#reset_user_password/2"},{"type":"function","title":"Examples - Lightning.Accounts.reset_user_password/2","doc":"iex> reset_user_password(user, %{password: \"new long password\", password_confirmation: \"new long password\"})\n {:ok, %User{}}\n\n iex> reset_user_password(user, %{password: \"valid\", password_confirmation: \"not the same\"})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#reset_user_password/2-examples"},{"type":"function","title":"Lightning.Accounts.schedule_user_deletion/2","doc":"Given a user and a confirmation email, this function sets a scheduled deletion\ndate based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is\nset, this date defaults to NOW but the automatic user purge cronjob will never\nrun. (Note that subsequent logins will be blocked for users pending deletion.)","ref":"Lightning.Accounts.html#schedule_user_deletion/2"},{"type":"function","title":"Lightning.Accounts.subscribe/0","doc":"","ref":"Lightning.Accounts.html#subscribe/0"},{"type":"function","title":"Lightning.Accounts.sudo_session_token_valid?/2","doc":"Checks if the given sudo token for the user is valid","ref":"Lightning.Accounts.html#sudo_session_token_valid?/2"},{"type":"function","title":"Lightning.Accounts.update_user_details/2","doc":"","ref":"Lightning.Accounts.html#update_user_details/2"},{"type":"function","title":"Lightning.Accounts.update_user_email/2","doc":"Updates the user email using the given token.\n\nIf the token matches, the user email is updated and the token is deleted.\nThe confirmed_at date is also updated to the current time.","ref":"Lightning.Accounts.html#update_user_email/2"},{"type":"function","title":"Lightning.Accounts.update_user_info/2","doc":"","ref":"Lightning.Accounts.html#update_user_info/2"},{"type":"function","title":"Lightning.Accounts.update_user_password/3","doc":"Updates the user password.","ref":"Lightning.Accounts.html#update_user_password/3"},{"type":"function","title":"Examples - Lightning.Accounts.update_user_password/3","doc":"iex> update_user_password(user, \"valid password\", %{password: ...})\n {:ok, %User{}}\n\n iex> update_user_password(user, \"invalid password\", %{password: ...})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#update_user_password/3-examples"},{"type":"function","title":"Lightning.Accounts.upsert_user_totp/2","doc":"Updates or Inserts the user's TOTP","ref":"Lightning.Accounts.html#upsert_user_totp/2"},{"type":"function","title":"Lightning.Accounts.valid_user_backup_code?/2","doc":"Validates if the given Backup code is valid.","ref":"Lightning.Accounts.html#valid_user_backup_code?/2"},{"type":"function","title":"Lightning.Accounts.valid_user_totp?/2","doc":"Validates if the given TOTP code is valid.","ref":"Lightning.Accounts.html#valid_user_totp?/2"},{"type":"function","title":"Lightning.Accounts.validate_change_user_email/2","doc":"Validates the changes for updating a user's email address.\n\nThis function ensures that:\n- The `email` and `current_password` fields are present.\n- The new email is in a valid format.\n- The new email is different from the current one.\n- The provided `current_password` matches the user's password.","ref":"Lightning.Accounts.html#validate_change_user_email/2"},{"type":"function","title":"Parameters - Lightning.Accounts.validate_change_user_email/2","doc":"- `user`: The `%User{}` struct representing the current user.\n- `params`: A map of parameters containing the new email and current password.","ref":"Lightning.Accounts.html#validate_change_user_email/2-parameters"},{"type":"function","title":"Returns - Lightning.Accounts.validate_change_user_email/2","doc":"An `Ecto.Changeset` containing any validation errors.","ref":"Lightning.Accounts.html#validate_change_user_email/2-returns"},{"type":"function","title":"Examples - Lightning.Accounts.validate_change_user_email/2","doc":"iex> validate_change_user_email(user, %{\"email\" => \"new@example.com\", \"current_password\" => \"secret\"})\n %Ecto.Changeset{...}","ref":"Lightning.Accounts.html#validate_change_user_email/2-examples"},{"type":"module","title":"Lightning.Accounts.Events","doc":"Publishes and subscribe to events related to user accounts.","ref":"Lightning.Accounts.Events.html"},{"type":"function","title":"Lightning.Accounts.Events.subscribe/0","doc":"","ref":"Lightning.Accounts.Events.html#subscribe/0"},{"type":"function","title":"Lightning.Accounts.Events.user_registered/1","doc":"","ref":"Lightning.Accounts.Events.html#user_registered/1"},{"type":"module","title":"Lightning.Accounts.User","doc":"The User model.","ref":"Lightning.Accounts.User.html"},{"type":"function","title":"Lightning.Accounts.User.changeset/2","doc":"","ref":"Lightning.Accounts.User.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.User.confirm_changeset/1","doc":"Confirms the account by setting `confirmed_at`.","ref":"Lightning.Accounts.User.html#confirm_changeset/1"},{"type":"function","title":"Lightning.Accounts.User.details_changeset/2","doc":"A user changeset for user details:\n\n- email\n- first_name\n- last_name\n- role","ref":"Lightning.Accounts.User.html#details_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.email_changeset/2","doc":"A user changeset for changing the email.\n\nIt requires the email to change otherwise an error is added.","ref":"Lightning.Accounts.User.html#email_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.github_token_changeset/2","doc":"","ref":"Lightning.Accounts.User.html#github_token_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.info_changeset/2","doc":"A user changeset for basic information:\n\n- first_name\n- last_name\n- contact_preference","ref":"Lightning.Accounts.User.html#info_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.password_changeset/3","doc":"A user changeset for changing the password.","ref":"Lightning.Accounts.User.html#password_changeset/3"},{"type":"function","title":"Options - Lightning.Accounts.User.password_changeset/3","doc":"* `:hash_password` - Hashes the password so it can be stored securely\n in the database and ensures the password field is cleared to prevent\n leaks in the logs. If password hashing is not needed and clearing the\n password field is not desired (like when using this changeset for\n validations on a LiveView form), this option can be set to `false`.\n Defaults to `true`.","ref":"Lightning.Accounts.User.html#password_changeset/3-options"},{"type":"function","title":"Lightning.Accounts.User.remove_github_token_changeset/1","doc":"","ref":"Lightning.Accounts.User.html#remove_github_token_changeset/1"},{"type":"function","title":"Lightning.Accounts.User.scheduled_deletion_changeset/2","doc":"A user changeset for changing the scheduled_deletion property.","ref":"Lightning.Accounts.User.html#scheduled_deletion_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.superuser_registration_changeset/2","doc":"A superuser changeset for registration.\n\nIt is important to validate the length of both email and password.\nOtherwise databases may truncate the email without warnings, which\ncould lead to unpredictable or insecure behaviour. Long passwords may\nalso be very expensive to hash for certain algorithms.","ref":"Lightning.Accounts.User.html#superuser_registration_changeset/2"},{"type":"function","title":"Options - Lightning.Accounts.User.superuser_registration_changeset/2","doc":"* `:hash_password` - Hashes the password so it can be stored securely\n in the database and ensures the password field is cleared to prevent\n leaks in the logs. If password hashing is not needed and clearing the\n password field is not desired (like when using this changeset for\n validations on a LiveView form), this option can be set to `false`.\n Defaults to `true`.","ref":"Lightning.Accounts.User.html#superuser_registration_changeset/2-options"},{"type":"function","title":"Lightning.Accounts.User.user_registration_changeset/2","doc":"A user changeset for registration.\n\nIt is important to validate the length of both email and password.\nOtherwise databases may truncate the email without warnings, which\ncould lead to unpredictable or insecure behaviour. Long passwords may\nalso be very expensive to hash for certain algorithms.","ref":"Lightning.Accounts.User.html#user_registration_changeset/2"},{"type":"function","title":"Options - Lightning.Accounts.User.user_registration_changeset/2","doc":"* `:hash_password` - Hashes the password so it can be stored securely\n in the database and ensures the password field is cleared to prevent\n leaks in the logs. If password hashing is not needed and clearing the\n password field is not desired (like when using this changeset for\n validations on a LiveView form), this option can be set to `false`.\n Defaults to `true`.","ref":"Lightning.Accounts.User.html#user_registration_changeset/2-options"},{"type":"function","title":"Lightning.Accounts.User.valid_password?/2","doc":"Verifies the password.\n\nIf there is no user or the user doesn't have a password, we call\n`Bcrypt.no_user_verify/0` to avoid timing attacks.","ref":"Lightning.Accounts.User.html#valid_password?/2"},{"type":"function","title":"Lightning.Accounts.User.validate_current_password/2","doc":"Validates the current password otherwise adds an error to the changeset.","ref":"Lightning.Accounts.User.html#validate_current_password/2"},{"type":"function","title":"Lightning.Accounts.User.validate_email/1","doc":"","ref":"Lightning.Accounts.User.html#validate_email/1"},{"type":"type","title":"Lightning.Accounts.User.t/0","doc":"","ref":"Lightning.Accounts.User.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.User.RolesEnum","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.cast/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.create_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.dump/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.embed_as/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.equal?/2","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.load/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schema/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Accounts.User.RolesEnum.t/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserBackupCode","doc":"User backup codes schema","ref":"Lightning.Accounts.UserBackupCode.html"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.changeset/2","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.generate_backup_code/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#generate_backup_code/0"},{"type":"type","title":"Lightning.Accounts.UserBackupCode.t/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserNotifier","doc":"The UserNotifier module.","ref":"Lightning.Accounts.UserNotifier.html"},{"type":"function","title":"Lightning.Accounts.UserNotifier.build_digest_url/3","doc":"","ref":"Lightning.Accounts.UserNotifier.html#build_digest_url/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/2","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/3","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_addition_notification/2","doc":"Deliver email to notify user of his addition of a project.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_addition_notification/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_digest/2","doc":"Deliver a project digest of daily/weekly or monthly activity to a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_digest/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_invitation_email/5","doc":"","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_invitation_email/5"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_reset_password_instructions/2","doc":"Deliver instructions to reset a user password.","ref":"Lightning.Accounts.UserNotifier.html#deliver_reset_password_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_instructions/2","doc":"Deliver instructions to update a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_warning/2","doc":"Deliver warning to update a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_warning/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.notify_history_export_completion/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#notify_history_export_completion/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.notify_project_deletion/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#notify_project_deletion/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.remind_account_confirmation/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#remind_account_confirmation/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_credential_deletion_notification_email/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#send_credential_deletion_notification_email/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_data_retention_change_email/2","doc":"Deliver an email to notify the user about a data retention setting change made in their project","ref":"Lightning.Accounts.UserNotifier.html#send_data_retention_change_email/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_deletion_notification_email/1","doc":"Deliver an email to notify the user about their account being deleted","ref":"Lightning.Accounts.UserNotifier.html#send_deletion_notification_email/1"},{"type":"module","title":"Lightning.Accounts.UserTOTP","doc":"User Time based OTPs schema","ref":"Lightning.Accounts.UserTOTP.html"},{"type":"function","title":"Lightning.Accounts.UserTOTP.changeset/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserTOTP.valid_totp?/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#valid_totp?/2"},{"type":"type","title":"Lightning.Accounts.UserTOTP.t/0","doc":"","ref":"Lightning.Accounts.UserTOTP.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserToken","doc":"The UserToken model.\n\nThe reason why we store session tokens in the database, even\nthough Phoenix already provides a session cookie, is because\nPhoenix' default session cookies are not persisted, they are\nsimply signed and potentially encrypted. This means they are\nvalid indefinitely, unless you change the signing/encryption\nsalt.\n\nTherefore, storing them allows individual user\nsessions to be expired. The token system can also be extended\nto store additional data, such as the device used for logging in.\nYou could then use this information to display all valid sessions\nand devices in the UI and allow users to explicitly expire any\nsession they deem invalid.","ref":"Lightning.Accounts.UserToken.html"},{"type":"function","title":"Lightning.Accounts.UserToken.build_email_token/3","doc":"Builds a token and its hash to be delivered to the user's email.\n\nThe non-hashed token is sent to the user email while the\nhashed part is stored in the database. The original token cannot be reconstructed,\nwhich means anyone with read-only access to the database cannot directly use\nthe token in the application to gain access. Furthermore, if the user changes\ntheir email in the system, the tokens sent to the previous email are no longer\nvalid.\n\nUsers can easily adapt the existing code to provide other types of delivery methods,\nfor example, by phone numbers.","ref":"Lightning.Accounts.UserToken.html#build_email_token/3"},{"type":"function","title":"Lightning.Accounts.UserToken.build_token/2","doc":"Generates a token that will be stored in a signed place,\nsuch as session or cookie. As they are signed, those\ntokens do not need to be hashed.","ref":"Lightning.Accounts.UserToken.html#build_token/2"},{"type":"function","title":"Lightning.Accounts.UserToken.changeset/2","doc":"","ref":"Lightning.Accounts.UserToken.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.Accounts.UserToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.Accounts.UserToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Accounts.UserToken.last_used_changeset/1","doc":"Update when the api token was last used by setting`last_used_at`.","ref":"Lightning.Accounts.UserToken.html#last_used_changeset/1"},{"type":"function","title":"Lightning.Accounts.UserToken.token_and_context_query/2","doc":"Returns the token struct for the given token value and context.","ref":"Lightning.Accounts.UserToken.html#token_and_context_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.user_and_contexts_query/2","doc":"Gets all tokens for the given user for the given contexts.","ref":"Lightning.Accounts.UserToken.html#user_and_contexts_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.Accounts.UserToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.Accounts.UserToken.html#verify_and_validate!/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_change_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query.\n\nThe query returns the user found by the token, if any.\n\nThis is used to validate requests to change the user\nemail. It is different from `verify_email_token_query/2` precisely because\n`verify_email_token_query/2` validates the email has not changed, which is\nthe starting point by this function.\n\nThe given token is valid if it matches its hashed counterpart in the\ndatabase and if it has not expired (after @change_email_validity_in_days).\nThe context must always start with \"change:\".","ref":"Lightning.Accounts.UserToken.html#verify_change_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query.\n\nThe query returns the user found by the token, if any.\n\nThe given token is valid if it matches its hashed counterpart in the\ndatabase and the user email has not changed. This function also checks\nif the token is being used within a certain period, depending on the\ncontext. The default contexts supported by this function are either\n\"confirm\", for account confirmation emails, and \"reset_password\",\nfor resetting the password. For verifying requests to change the email,\nsee `verify_change_email_token_query/2`.","ref":"Lightning.Accounts.UserToken.html#verify_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query.\n\nThe query returns the user found by the token, if any.\n\nThe token is valid if it matches the value in the database and it has\nnot expired (after @auth_validity_in_seconds or @session_validity_in_days).","ref":"Lightning.Accounts.UserToken.html#verify_token_query/2"},{"type":"behaviour","title":"Lightning.Config","doc":"Centralised runtime configuration for Lightning.","ref":"Lightning.Config.html"},{"type":"function","title":"Lightning.Config.apollo/1","doc":"Returns the Apollo server configuration.","ref":"Lightning.Config.html#apollo/1"},{"type":"callback","title":"Lightning.Config.apollo/1","doc":"","ref":"Lightning.Config.html#c:apollo/1"},{"type":"function","title":"Lightning.Config.check_flag?/1","doc":"","ref":"Lightning.Config.html#check_flag?/1"},{"type":"callback","title":"Lightning.Config.check_flag?/1","doc":"","ref":"Lightning.Config.html#c:check_flag?/1"},{"type":"function","title":"Lightning.Config.cors_origin/0","doc":"","ref":"Lightning.Config.html#cors_origin/0"},{"type":"callback","title":"Lightning.Config.cors_origin/0","doc":"","ref":"Lightning.Config.html#c:cors_origin/0"},{"type":"function","title":"Lightning.Config.default_max_run_duration/0","doc":"Returns the default maximum run duration in seconds.","ref":"Lightning.Config.html#default_max_run_duration/0"},{"type":"callback","title":"Lightning.Config.default_max_run_duration/0","doc":"","ref":"Lightning.Config.html#c:default_max_run_duration/0"},{"type":"function","title":"Lightning.Config.email_sender_name/0","doc":"","ref":"Lightning.Config.html#email_sender_name/0"},{"type":"callback","title":"Lightning.Config.email_sender_name/0","doc":"","ref":"Lightning.Config.html#c:email_sender_name/0"},{"type":"function","title":"Lightning.Config.get_extension_mod/1","doc":"","ref":"Lightning.Config.html#get_extension_mod/1"},{"type":"callback","title":"Lightning.Config.get_extension_mod/1","doc":"","ref":"Lightning.Config.html#c:get_extension_mod/1"},{"type":"function","title":"Lightning.Config.google/1","doc":"","ref":"Lightning.Config.html#google/1"},{"type":"callback","title":"Lightning.Config.google/1","doc":"","ref":"Lightning.Config.html#c:google/1"},{"type":"function","title":"Lightning.Config.grace_period/0","doc":"The grace period is configurable and is used to wait for an additional\namount of time after a given run was meant to be finished.\n\nThe returned value is in seconds.","ref":"Lightning.Config.html#grace_period/0"},{"type":"callback","title":"Lightning.Config.grace_period/0","doc":"","ref":"Lightning.Config.html#c:grace_period/0"},{"type":"function","title":"Lightning.Config.instance_admin_email/0","doc":"","ref":"Lightning.Config.html#instance_admin_email/0"},{"type":"callback","title":"Lightning.Config.instance_admin_email/0","doc":"","ref":"Lightning.Config.html#c:instance_admin_email/0"},{"type":"function","title":"Lightning.Config.kafka_duplicate_tracking_retention_seconds/0","doc":"","ref":"Lightning.Config.html#kafka_duplicate_tracking_retention_seconds/0"},{"type":"callback","title":"Lightning.Config.kafka_duplicate_tracking_retention_seconds/0","doc":"","ref":"Lightning.Config.html#c:kafka_duplicate_tracking_retention_seconds/0"},{"type":"function","title":"Lightning.Config.kafka_number_of_consumers/0","doc":"","ref":"Lightning.Config.html#kafka_number_of_consumers/0"},{"type":"callback","title":"Lightning.Config.kafka_number_of_consumers/0","doc":"","ref":"Lightning.Config.html#c:kafka_number_of_consumers/0"},{"type":"function","title":"Lightning.Config.kafka_number_of_messages_per_second/0","doc":"","ref":"Lightning.Config.html#kafka_number_of_messages_per_second/0"},{"type":"callback","title":"Lightning.Config.kafka_number_of_messages_per_second/0","doc":"","ref":"Lightning.Config.html#c:kafka_number_of_messages_per_second/0"},{"type":"function","title":"Lightning.Config.kafka_number_of_processors/0","doc":"","ref":"Lightning.Config.html#kafka_number_of_processors/0"},{"type":"callback","title":"Lightning.Config.kafka_number_of_processors/0","doc":"","ref":"Lightning.Config.html#c:kafka_number_of_processors/0"},{"type":"function","title":"Lightning.Config.kafka_triggers_enabled?/0","doc":"","ref":"Lightning.Config.html#kafka_triggers_enabled?/0"},{"type":"callback","title":"Lightning.Config.kafka_triggers_enabled?/0","doc":"","ref":"Lightning.Config.html#c:kafka_triggers_enabled?/0"},{"type":"function","title":"Lightning.Config.oauth_provider/1","doc":"","ref":"Lightning.Config.html#oauth_provider/1"},{"type":"callback","title":"Lightning.Config.oauth_provider/1","doc":"","ref":"Lightning.Config.html#c:oauth_provider/1"},{"type":"function","title":"Lightning.Config.purge_deleted_after_days/0","doc":"","ref":"Lightning.Config.html#purge_deleted_after_days/0"},{"type":"callback","title":"Lightning.Config.purge_deleted_after_days/0","doc":"","ref":"Lightning.Config.html#c:purge_deleted_after_days/0"},{"type":"function","title":"Lightning.Config.repo_connection_token_signer/0","doc":"","ref":"Lightning.Config.html#repo_connection_token_signer/0"},{"type":"callback","title":"Lightning.Config.repo_connection_token_signer/0","doc":"","ref":"Lightning.Config.html#c:repo_connection_token_signer/0"},{"type":"function","title":"Lightning.Config.reset_password_token_validity_in_days/0","doc":"","ref":"Lightning.Config.html#reset_password_token_validity_in_days/0"},{"type":"callback","title":"Lightning.Config.reset_password_token_validity_in_days/0","doc":"","ref":"Lightning.Config.html#c:reset_password_token_validity_in_days/0"},{"type":"function","title":"Lightning.Config.run_token_signer/0","doc":"Returns the Token signer used to sign and verify run tokens.","ref":"Lightning.Config.html#run_token_signer/0"},{"type":"callback","title":"Lightning.Config.run_token_signer/0","doc":"","ref":"Lightning.Config.html#c:run_token_signer/0"},{"type":"function","title":"Lightning.Config.storage/0","doc":"","ref":"Lightning.Config.html#storage/0"},{"type":"callback","title":"Lightning.Config.storage/0","doc":"","ref":"Lightning.Config.html#c:storage/0"},{"type":"function","title":"Lightning.Config.storage/1","doc":"","ref":"Lightning.Config.html#storage/1"},{"type":"callback","title":"Lightning.Config.storage/1","doc":"","ref":"Lightning.Config.html#c:storage/1"},{"type":"function","title":"Lightning.Config.usage_tracking/0","doc":"","ref":"Lightning.Config.html#usage_tracking/0"},{"type":"callback","title":"Lightning.Config.usage_tracking/0","doc":"","ref":"Lightning.Config.html#c:usage_tracking/0"},{"type":"function","title":"Lightning.Config.usage_tracking_cron_opts/0","doc":"","ref":"Lightning.Config.html#usage_tracking_cron_opts/0"},{"type":"callback","title":"Lightning.Config.usage_tracking_cron_opts/0","doc":"","ref":"Lightning.Config.html#c:usage_tracking_cron_opts/0"},{"type":"function","title":"Lightning.Config.worker_secret/0","doc":"","ref":"Lightning.Config.html#worker_secret/0"},{"type":"callback","title":"Lightning.Config.worker_secret/0","doc":"","ref":"Lightning.Config.html#c:worker_secret/0"},{"type":"function","title":"Lightning.Config.worker_token_signer/0","doc":"Returns the Token signer used to verify worker tokens.","ref":"Lightning.Config.html#worker_token_signer/0"},{"type":"callback","title":"Lightning.Config.worker_token_signer/0","doc":"","ref":"Lightning.Config.html#c:worker_token_signer/0"},{"type":"module","title":"Lightning.Config.Bootstrap","doc":"Bootstrap the application environment.\n\nThis module is responsible for setting up the application environment based on\nthe configuration provided by the user.\n\nUsually, config calls are made in the `config/runtime.exs` file. This module\nabstracts the runtime configuration into a module that can be tested and\ncalled from other places (aside from `config/runtime.exs`) file.\n\n> ##","ref":"Lightning.Config.Bootstrap.html"},{"type":"module","title":"Sourcing envs {: .info} - Lightning.Config.Bootstrap","doc":">\n> Internally this module uses `Dotenvy.source/1` to source environment variables\n> from the `.env`, `.env. `, and `.env. .override` files.\n> It also sources the system environment variables.\n>\n> Calling `configure/0` without calling `source_envs/0` or `Dotenvy.source/2`\n> first will result in no environment variables being loaded.\n\nUsage:\n\n```elixir\nLightning.Config.Bootstrap.source_envs()\nLightning.Config.Bootstrap.configure()\n```","ref":"Lightning.Config.Bootstrap.html#module-sourcing-envs-info"},{"type":"function","title":"Lightning.Config.Bootstrap.configure/0","doc":"","ref":"Lightning.Config.Bootstrap.html#configure/0"},{"type":"function","title":"Lightning.Config.Bootstrap.source_envs/0","doc":"","ref":"Lightning.Config.Bootstrap.html#source_envs/0"},{"type":"module","title":"Lightning.Config.Utils","doc":"Utility functions for working with the application environment.","ref":"Lightning.Config.Utils.html"},{"type":"function","title":"Lightning.Config.Utils.ensure_boolean/1","doc":"","ref":"Lightning.Config.Utils.html#ensure_boolean/1"},{"type":"function","title":"Lightning.Config.Utils.get_env/2","doc":"Retrieve a value nested in the application environment.","ref":"Lightning.Config.Utils.html#get_env/2"},{"type":"module","title":"Lightning.Runs","doc":"Gathers operations to create, update and delete Runs.","ref":"Lightning.Runs.html"},{"type":"function","title":"Lightning.Runs.append_run_log/3","doc":"","ref":"Lightning.Runs.html#append_run_log/3"},{"type":"function","title":"Lightning.Runs.complete_run/2","doc":"","ref":"Lightning.Runs.html#complete_run/2"},{"type":"function","title":"Lightning.Runs.complete_step/2","doc":"","ref":"Lightning.Runs.html#complete_step/2"},{"type":"function","title":"Lightning.Runs.enqueue/1","doc":"Enqueue a run to be processed.","ref":"Lightning.Runs.html#enqueue/1"},{"type":"function","title":"Lightning.Runs.get/2","doc":"Get a run by id.\n\nOptionally preload associations by passing a list of atoms to `:include`.\n\n Lightning.Runs.get(id, include: [:workflow])","ref":"Lightning.Runs.html#get/2"},{"type":"function","title":"Lightning.Runs.get_credential/2","doc":"","ref":"Lightning.Runs.html#get_credential/2"},{"type":"function","title":"Lightning.Runs.get_dataclip_body/1","doc":"Returns only the dataclip body as a string","ref":"Lightning.Runs.html#get_dataclip_body/1"},{"type":"function","title":"Lightning.Runs.get_dataclip_request/1","doc":"Returns only the dataclip request as a string","ref":"Lightning.Runs.html#get_dataclip_request/1"},{"type":"function","title":"Lightning.Runs.get_for_worker/1","doc":"Get a run by id, preloading the snapshot and its credential.","ref":"Lightning.Runs.html#get_for_worker/1"},{"type":"function","title":"Lightning.Runs.get_input/1","doc":"Returns a run's dataclip formatted for use as state.\n\nOnly `http_request` and kafka dataclips are changed,\ntheir `body` is nested inside a `\"data\"` key and `request` data\nis added as a `\"request\"` key.\n\nSee LightingWeb.RunChannel.handle_in(\"fetch:dataclip\", _, _)\nfor more details.","ref":"Lightning.Runs.html#get_input/1"},{"type":"function","title":"Lightning.Runs.get_log_lines/2","doc":"","ref":"Lightning.Runs.html#get_log_lines/2"},{"type":"function","title":"Lightning.Runs.get_project_id_for_run/1","doc":"","ref":"Lightning.Runs.html#get_project_id_for_run/1"},{"type":"function","title":"Lightning.Runs.mark_run_lost/1","doc":"","ref":"Lightning.Runs.html#mark_run_lost/1"},{"type":"function","title":"Lightning.Runs.mark_steps_lost/1","doc":"","ref":"Lightning.Runs.html#mark_steps_lost/1"},{"type":"function","title":"Lightning.Runs.start_run/2","doc":"","ref":"Lightning.Runs.html#start_run/2"},{"type":"function","title":"Lightning.Runs.start_step/2","doc":"Creates a Step for a given run and job.\n\nThe Step is created and marked as started at the current time.","ref":"Lightning.Runs.html#start_step/2"},{"type":"function","title":"Lightning.Runs.subscribe/1","doc":"","ref":"Lightning.Runs.html#subscribe/1"},{"type":"function","title":"Lightning.Runs.update_run/1","doc":"","ref":"Lightning.Runs.html#update_run/1"},{"type":"function","title":"Lightning.Runs.update_runs/2","doc":"","ref":"Lightning.Runs.html#update_runs/2"},{"type":"function","title":"Lightning.Runs.wipe_dataclips/1","doc":"Clears the body and request fields of the dataclip associated with the given run.","ref":"Lightning.Runs.html#wipe_dataclips/1"},{"type":"module","title":"Lightning.Runs.Events","doc":"","ref":"Lightning.Runs.Events.html"},{"type":"function","title":"Lightning.Runs.Events.dataclip_updated/2","doc":"","ref":"Lightning.Runs.Events.html#dataclip_updated/2"},{"type":"function","title":"Lightning.Runs.Events.log_appended/1","doc":"","ref":"Lightning.Runs.Events.html#log_appended/1"},{"type":"function","title":"Lightning.Runs.Events.run_updated/1","doc":"","ref":"Lightning.Runs.Events.html#run_updated/1"},{"type":"function","title":"Lightning.Runs.Events.step_completed/2","doc":"","ref":"Lightning.Runs.Events.html#step_completed/2"},{"type":"function","title":"Lightning.Runs.Events.step_started/2","doc":"","ref":"Lightning.Runs.Events.html#step_started/2"},{"type":"function","title":"Lightning.Runs.Events.subscribe/1","doc":"","ref":"Lightning.Runs.Events.html#subscribe/1"},{"type":"module","title":"Lightning.Runs.Handlers","doc":"Handler modules for working with runs.","ref":"Lightning.Runs.Handlers.html"},{"type":"module","title":"Lightning.Runs.Handlers.CompleteRun","doc":"Schema to validate the input attributes of a completed run.","ref":"Lightning.Runs.Handlers.CompleteRun.html"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteRun.call/2","doc":"","ref":"Lightning.Runs.Handlers.CompleteRun.html#call/2"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteRun.new/1","doc":"","ref":"Lightning.Runs.Handlers.CompleteRun.html#new/1"},{"type":"module","title":"Lightning.Runs.Handlers.CompleteStep","doc":"Schema to validate the input attributes of a completed step.","ref":"Lightning.Runs.Handlers.CompleteStep.html"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteStep.call/2","doc":"","ref":"Lightning.Runs.Handlers.CompleteStep.html#call/2"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteStep.new/2","doc":"","ref":"Lightning.Runs.Handlers.CompleteStep.html#new/2"},{"type":"module","title":"Lightning.Runs.Handlers.StartRun","doc":"Schema to validate the input attributes of a started run.","ref":"Lightning.Runs.Handlers.StartRun.html"},{"type":"function","title":"Lightning.Runs.Handlers.StartRun.call/2","doc":"","ref":"Lightning.Runs.Handlers.StartRun.html#call/2"},{"type":"function","title":"Lightning.Runs.Handlers.StartRun.new/1","doc":"","ref":"Lightning.Runs.Handlers.StartRun.html#new/1"},{"type":"module","title":"Lightning.Runs.Handlers.StartStep","doc":"Schema to validate the input attributes of a started step.","ref":"Lightning.Runs.Handlers.StartStep.html"},{"type":"function","title":"Lightning.Runs.Handlers.StartStep.call/2","doc":"","ref":"Lightning.Runs.Handlers.StartStep.html#call/2"},{"type":"module","title":"Lightning.Runs.PromExPlugin","doc":"Metrics callbacks implementation for the PromEx plugin.\n\nEvent metrics are used to publish the dispatched events in the system.\nPolling metrics are used to publish metrics that are calculated by polling data periodically.","ref":"Lightning.Runs.PromExPlugin.html"},{"type":"function","title":"Lightning.Runs.PromExPlugin.calculate_average_claim_duration/2","doc":"","ref":"Lightning.Runs.PromExPlugin.html#calculate_average_claim_duration/2"},{"type":"function","title":"Lightning.Runs.PromExPlugin.count_finalised_runs/1","doc":"","ref":"Lightning.Runs.PromExPlugin.html#count_finalised_runs/1"},{"type":"function","title":"Lightning.Runs.PromExPlugin.run_queue_metrics/2","doc":"","ref":"Lightning.Runs.PromExPlugin.html#run_queue_metrics/2"},{"type":"function","title":"Lightning.Runs.PromExPlugin.stalled_run_count/1","doc":"","ref":"Lightning.Runs.PromExPlugin.html#stalled_run_count/1"},{"type":"module","title":"Lightning.Runs.Query","doc":"Query functions for working with Runs","ref":"Lightning.Runs.Query.html"},{"type":"function","title":"Lightning.Runs.Query.eligible_for_claim/0","doc":"Query to return runs that are eligible for claiming.\n\nUses `in_progress_window/0` and filters for runs that are either in the\navailable state and have not reached the concurrency limit for their workflow.\n\n> #","ref":"Lightning.Runs.Query.html#eligible_for_claim/0"},{"type":"function","title":"Note {: .info} - Lightning.Runs.Query.eligible_for_claim/0","doc":"> This query does not currently take into account the priority of the run.\n> To allow for prioritization, the query should be updated to order by\n> priority.\n>\n> ```elixir\n> eligible_for_claim() |> prepend_order_by([:priority])\n> ```","ref":"Lightning.Runs.Query.html#eligible_for_claim/0-note-info"},{"type":"function","title":"Lightning.Runs.Query.in_progress_window/0","doc":"Query to return a list of runs that are either in progress (started or claimed)\nor available.\n\nThe select clause includes:\n- `id`, the id of the run\n- `state`, the state of the run\n- `row_number`, the number of the row in the window, per workflow\n- `limit`, the maximum number of runs that can be claimed for the workflow","ref":"Lightning.Runs.Query.html#in_progress_window/0"},{"type":"function","title":"Lightning.Runs.Query.lost/0","doc":"Return all runs that have been claimed by a worker before the earliest\nacceptable start time (determined by the run options and grace period) but are\nstill incomplete.\n\nThis indicates that we may have lost contact with the worker\nthat was responsible for executing the run.","ref":"Lightning.Runs.Query.html#lost/0"},{"type":"function","title":"Lightning.Runs.Query.lost_steps/0","doc":"","ref":"Lightning.Runs.Query.html#lost_steps/0"},{"type":"module","title":"Lightning.Runs.Queue","doc":"Allows adding, removing or claiming work to be executed by the Runtime.","ref":"Lightning.Runs.Queue.html"},{"type":"function","title":"Lightning.Runs.Queue.claim/2","doc":"","ref":"Lightning.Runs.Queue.html#claim/2"},{"type":"module","title":"Lightning.Runs.RunOptions","doc":"Options that are passed to the worker to control configurable limits and\nbehaviors during run execution and reporting.","ref":"Lightning.Runs.RunOptions.html"},{"type":"type","title":"Lightning.Runs.RunOptions.keyword_list/0","doc":"","ref":"Lightning.Runs.RunOptions.html#t:keyword_list/0"},{"type":"type","title":"Lightning.Runs.RunOptions.t/0","doc":"","ref":"Lightning.Runs.RunOptions.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrders","doc":"Context for creating WorkOrders.","ref":"Lightning.WorkOrders.html"},{"type":"module","title":"Work Orders - Lightning.WorkOrders","doc":"Work Orders represent the entrypoint for a unit of work in Lightning.\nThey allow you to track the status of a webhook or cron trigger.\n\nFor example if a user makes a request to a webhook endpoint, a Work Order\nis created with it's associated Workflow and Dataclip.\n\nEvery Work Order has at least one Run, which represents a single\ninvocation of the Workflow. If the workflow fails, and the run is retried,\na new Run is created on the Work Order.\n\nThis allows you group all the runs for a single webhook, and track\nthe success or failure of a given dataclip.","ref":"Lightning.WorkOrders.html#module-work-orders"},{"type":"module","title":"Creating Work Orders - Lightning.WorkOrders","doc":"Work Orders can be created in three ways:\n\n1. Via a webhook trigger\n2. Via a cron trigger\n3. Manually by a user (via the UI or API)\n\nRetries do not create new Work Orders, but rather new Runs on the existing\nWork Order.","ref":"Lightning.WorkOrders.html#module-creating-work-orders"},{"type":"function","title":"Lightning.WorkOrders.build/1","doc":"","ref":"Lightning.WorkOrders.html#build/1"},{"type":"function","title":"Lightning.WorkOrders.build_for/2","doc":"","ref":"Lightning.WorkOrders.html#build_for/2"},{"type":"function","title":"Lightning.WorkOrders.create_for/1","doc":"","ref":"Lightning.WorkOrders.html#create_for/1"},{"type":"function","title":"Lightning.WorkOrders.create_for/3","doc":"Create a new Work Order.\n\n**For a webhook**\n create_for(trigger, workflow: workflow, dataclip: dataclip)\n\n**For a user**\n create_for(job, workflow: workflow, dataclip: dataclip, user: user)","ref":"Lightning.WorkOrders.html#create_for/3"},{"type":"function","title":"Lightning.WorkOrders.enqueue_many_for_retry/2","doc":"Enqueue multiple runs for retry in the same transaction.","ref":"Lightning.WorkOrders.html#enqueue_many_for_retry/2"},{"type":"function","title":"Lightning.WorkOrders.get/2","doc":"Get a Work Order by id.\n\nOptionally preload associations by passing a list of atoms to `:include`.\n\n Lightning.WorkOrders.get(id, include: [:runs])","ref":"Lightning.WorkOrders.html#get/2"},{"type":"function","title":"Lightning.WorkOrders.retry/3","doc":"Retry a run from a given step.\n\nThis will create a new Run on the Work Order, and enqueue it for\nprocessing.\n\nWhen creating a new Run, a graph of the workflow is created steps that are\nindependent from the selected step and its downstream flow are associated with\nthis new run, but not executed again.","ref":"Lightning.WorkOrders.html#retry/3"},{"type":"function","title":"Lightning.WorkOrders.retry_many/2","doc":"","ref":"Lightning.WorkOrders.html#retry_many/2"},{"type":"function","title":"Lightning.WorkOrders.retry_many/3","doc":"","ref":"Lightning.WorkOrders.html#retry_many/3"},{"type":"function","title":"Lightning.WorkOrders.subscribe/1","doc":"","ref":"Lightning.WorkOrders.html#subscribe/1"},{"type":"function","title":"Lightning.WorkOrders.update_state/1","doc":"Updates the state of a WorkOrder based on the state of a run.\n\nThis considers the state of all runs on the WorkOrder, with the\nRun passed in as the latest run.\n\nSee `Lightning.WorkOrders.Query.state_for/1` for more details.","ref":"Lightning.WorkOrders.html#update_state/1"},{"type":"type","title":"Lightning.WorkOrders.work_order_option/0","doc":"","ref":"Lightning.WorkOrders.html#t:work_order_option/0"},{"type":"module","title":"Lightning.WorkOrders.ExportWorker","doc":"This module handles the export of work orders for a given project. The export process is performed asynchronously using the Oban background job system.","ref":"Lightning.WorkOrders.ExportWorker.html"},{"type":"module","title":"Responsibilities - Lightning.WorkOrders.ExportWorker","doc":"- **Enqueueing Export Jobs**: The `enqueue_export/2` function creates and enqueues an Oban job for exporting work orders based on the given project and search parameters.\n - **Processing Exports**: The `perform/1` function is the main entry point for executing the export job. It retrieves the project, processes work orders, and handles the export process.\n - **Export Logic**: The export logic involves querying work orders, extracting relevant entities, processing logs and dataclips asynchronously, and writing the final export data to files.\n - **Error Handling**: The module includes comprehensive error handling and logging to ensure that issues during the export process are recorded and can be diagnosed.\n - **Zip File Creation**: After processing, the exported files are compressed into a zip file for easy download or further use.","ref":"Lightning.WorkOrders.ExportWorker.html#module-responsibilities"},{"type":"module","title":"Usage - Lightning.WorkOrders.ExportWorker","doc":"- To enqueue an export job, call `enqueue_export/2` with the project and search parameters.\n - The export process is triggered by Oban and runs in the `history_exports` queue, limited to a single attempt per job.","ref":"Lightning.WorkOrders.ExportWorker.html#module-usage"},{"type":"module","title":"Example - Lightning.WorkOrders.ExportWorker","doc":"```elixir\n # Enqueue an export job\n Lightning.WorkOrders.ExportWorker.enqueue_export(project, search_params)\n\n # The job will run in the background and log the status of the export process.\n ```\n\n This module is designed to handle potentially large datasets efficiently by using streaming, async processing, and error recovery mechanisms.","ref":"Lightning.WorkOrders.ExportWorker.html#module-example"},{"type":"function","title":"Lightning.WorkOrders.ExportWorker.enqueue_export/3","doc":"","ref":"Lightning.WorkOrders.ExportWorker.html#enqueue_export/3"},{"type":"function","title":"Lightning.WorkOrders.ExportWorker.extract_entities/1","doc":"","ref":"Lightning.WorkOrders.ExportWorker.html#extract_entities/1"},{"type":"function","title":"Lightning.WorkOrders.ExportWorker.fetch_dataclips/1","doc":"","ref":"Lightning.WorkOrders.ExportWorker.html#fetch_dataclips/1"},{"type":"module","title":"Lightning.WorkOrders.Manual","doc":"A model is used to build WorkOrders with custom input data.","ref":"Lightning.WorkOrders.Manual.html"},{"type":"function","title":"Lightning.WorkOrders.Manual.new/2","doc":"","ref":"Lightning.WorkOrders.Manual.html#new/2"},{"type":"type","title":"Lightning.WorkOrders.Manual.t/0","doc":"","ref":"Lightning.WorkOrders.Manual.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrders.Query","doc":"Query functions for the Lightning.WorkOrders module.","ref":"Lightning.WorkOrders.Query.html"},{"type":"function","title":"Lightning.WorkOrders.Query.state_for/1","doc":"Query to calculate the current state of a workorder.\n\nIt takes a run, as the state is updated after each run is changed.\n\nThe logic is as follows:\n\n- All _other_ Runs that are not in a finished state are considered first.\n- The current Run is unioned onto the unfinished runs with a null\n ordinality.\n- The runs are ordered by state in the following order\n `started > available > claimed > null`\n- The run states are then mapped to the workorder state enum, so `available`\n and `claimed` are both mapped to `pending` and `started` is mapped to `running`\n\n> The `null` ordinality ensures that the current run is always last in the\n> ordering.","ref":"Lightning.WorkOrders.Query.html#state_for/1"},{"type":"module","title":"Lightning.WorkOrders.RetryManyWorkOrdersJob","doc":"Enqueue multiple work orders for retry.","ref":"Lightning.WorkOrders.RetryManyWorkOrdersJob.html"},{"type":"module","title":"Lightning.WorkOrders.SearchParams","doc":"This module is used to parse search parameters for work orders and provide\na query to the database.","ref":"Lightning.WorkOrders.SearchParams.html"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.all_statuses_set?/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#all_statuses_set?/1"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.from_map/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#from_map/1"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.new/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#new/1"},{"type":"macro","title":"Lightning.WorkOrders.SearchParams.status_list/0","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#status_list/0"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.to_uri_params/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#to_uri_params/1"},{"type":"type","title":"Lightning.WorkOrders.SearchParams.t/0","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#t:t/0"},{"type":"module","title":"Lightning.Credentials","doc":"The Credentials context.","ref":"Lightning.Credentials.html"},{"type":"function","title":"Lightning.Credentials.basic_auth_for/1","doc":"","ref":"Lightning.Credentials.html#basic_auth_for/1"},{"type":"function","title":"Lightning.Credentials.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Credentials.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Credentials.change_credential/2","doc":"Returns an `%Ecto.Changeset{}` for tracking credential changes.","ref":"Lightning.Credentials.html#change_credential/2"},{"type":"function","title":"Examples - Lightning.Credentials.change_credential/2","doc":"iex> change_credential(credential)\n %Ecto.Changeset{data: %Credential{}}","ref":"Lightning.Credentials.html#change_credential/2-examples"},{"type":"function","title":"Lightning.Credentials.create_credential/1","doc":"Creates a credential.","ref":"Lightning.Credentials.html#create_credential/1"},{"type":"function","title":"Examples - Lightning.Credentials.create_credential/1","doc":"iex> create_credential(%{field: value})\n {:ok, %Credential{}}\n\n iex> create_credential(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#create_credential/1-examples"},{"type":"function","title":"Lightning.Credentials.delete_credential/1","doc":"Deletes a credential.","ref":"Lightning.Credentials.html#delete_credential/1"},{"type":"function","title":"Examples - Lightning.Credentials.delete_credential/1","doc":"iex> delete_credential(credential)\n {:ok, %Credential{}}\n\n iex> delete_credential(credential)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#delete_credential/1-examples"},{"type":"function","title":"Lightning.Credentials.get_credential!/1","doc":"Gets a single credential.\n\nRaises `Ecto.NoResultsError` if the Credential does not exist.","ref":"Lightning.Credentials.html#get_credential!/1"},{"type":"function","title":"Examples - Lightning.Credentials.get_credential!/1","doc":"iex> get_credential!(123)\n %Credential{}\n\n iex> get_credential!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Credentials.html#get_credential!/1-examples"},{"type":"function","title":"Lightning.Credentials.get_credential_by_project_credential/1","doc":"","ref":"Lightning.Credentials.html#get_credential_by_project_credential/1"},{"type":"function","title":"Lightning.Credentials.get_credential_for_update!/1","doc":"","ref":"Lightning.Credentials.html#get_credential_for_update!/1"},{"type":"function","title":"Lightning.Credentials.get_schema/1","doc":"Creates a credential schema from credential json schema.","ref":"Lightning.Credentials.html#get_schema/1"},{"type":"function","title":"Lightning.Credentials.has_activity_in_projects?/1","doc":"Checks if a given `Credential` has any associated `Step` activity.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1"},{"type":"function","title":"Parameters - Lightning.Credentials.has_activity_in_projects?/1","doc":"- `_credential`: A `Credential` struct. Only the `id` field is used by the function.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.has_activity_in_projects?/1","doc":"- `true` if there's at least one `Step` associated with the given `Credential`.\n - `false` otherwise.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-returns"},{"type":"function","title":"Examples - Lightning.Credentials.has_activity_in_projects?/1","doc":"iex> has_activity_in_projects?(%Credential{id: some_id})\n true\n\n iex> has_activity_in_projects?(%Credential{id: another_id})\n false","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-examples"},{"type":"function","title":"Notes - Lightning.Credentials.has_activity_in_projects?/1","doc":"This function leverages the association between `Step` and `Credential` to\ndetermine if any steps exist for a given credential. It's a fast check that\ndoes not load any records into memory, but simply checks for their existence.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-notes"},{"type":"function","title":"Lightning.Credentials.invalid_projects_for_user/2","doc":"Given a credential and a user, returns a list of invalid projects—i.e., those\nthat the credential is shared with but that the user does not have access to.\n\nThis is used to generate a validation error when a credential cannot be\ntransferred.","ref":"Lightning.Credentials.html#invalid_projects_for_user/2"},{"type":"function","title":"Examples - Lightning.Credentials.invalid_projects_for_user/2","doc":"iex> can_credential_be_shared_to_user(credential_id, user_id)\n []\n\n iex> can_credential_be_shared_to_user(credential_id, user_id)\n [\"52ea8758-6ce5-43d7-912f-6a1e1f11dc55\"]","ref":"Lightning.Credentials.html#invalid_projects_for_user/2-examples"},{"type":"function","title":"Lightning.Credentials.list_credentials/1","doc":"Retrieves all credentials based on the given context, either a Project or a User.","ref":"Lightning.Credentials.html#list_credentials/1"},{"type":"function","title":"Parameters - Lightning.Credentials.list_credentials/1","doc":"- context: The Project or User struct to retrieve credentials for.","ref":"Lightning.Credentials.html#list_credentials/1-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.list_credentials/1","doc":"- A list of credentials associated with the given Project or created by the given User.","ref":"Lightning.Credentials.html#list_credentials/1-returns"},{"type":"function","title":"Examples - Lightning.Credentials.list_credentials/1","doc":"When given a Project:\n iex> list_credentials(%Project{id: 1})\n [%Credential{project_id: 1}, %Credential{project_id: 1}]\n\n When given a User:\n iex> list_credentials(%User{id: 123})\n [%Credential{user_id: 123}, %Credential{user_id: 123}]","ref":"Lightning.Credentials.html#list_credentials/1-examples"},{"type":"function","title":"Lightning.Credentials.lookup_adapter/1","doc":"","ref":"Lightning.Credentials.html#lookup_adapter/1"},{"type":"function","title":"Lightning.Credentials.maybe_refresh_token/1","doc":"","ref":"Lightning.Credentials.html#maybe_refresh_token/1"},{"type":"function","title":"Lightning.Credentials.perform/1","doc":"Perform, when called with %{\"type\" => \"purge_deleted\"}\nwill find credentials that are ready for permanent deletion, set their bodies\nto null, and try to purge them.","ref":"Lightning.Credentials.html#perform/1"},{"type":"function","title":"Lightning.Credentials.schedule_credential_deletion/1","doc":"Schedules a given credential for deletion.\n\nThe deletion date is determined based on the `:purge_deleted_after_days` configuration\nin the application environment. If this configuration is absent, the credential is scheduled\nfor immediate deletion.\n\nThe function will also perform necessary side effects such as:\n - Removing associations of the credential.\n - Notifying the owner of the credential about the scheduled deletion.","ref":"Lightning.Credentials.html#schedule_credential_deletion/1"},{"type":"function","title":"Parameters - Lightning.Credentials.schedule_credential_deletion/1","doc":"- `credential`: A `Credential` struct that is to be scheduled for deletion.","ref":"Lightning.Credentials.html#schedule_credential_deletion/1-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.schedule_credential_deletion/1","doc":"- `{:ok, credential}`: Returns an `:ok` tuple with the updated credential struct if the\n update was successful.\n - `{:error, changeset}`: Returns an `:error` tuple with the changeset if the update failed.","ref":"Lightning.Credentials.html#schedule_credential_deletion/1-returns"},{"type":"function","title":"Examples - Lightning.Credentials.schedule_credential_deletion/1","doc":"iex> schedule_credential_deletion(%Credential{id: some_id})\n {:ok, %Credential{}}\n\n iex> schedule_credential_deletion(%Credential{})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#schedule_credential_deletion/1-examples"},{"type":"function","title":"Lightning.Credentials.sensitive_values_for/1","doc":"","ref":"Lightning.Credentials.html#sensitive_values_for/1"},{"type":"function","title":"Lightning.Credentials.update_credential/2","doc":"Updates a credential.","ref":"Lightning.Credentials.html#update_credential/2"},{"type":"function","title":"Examples - Lightning.Credentials.update_credential/2","doc":"iex> update_credential(credential, %{field: new_value})\n {:ok, %Credential{}}\n\n iex> update_credential(credential, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#update_credential/2-examples"},{"type":"module","title":"Lightning.Credentials.Audit","doc":"Model for storing changes to Credentials","ref":"Lightning.Credentials.Audit.html"},{"type":"function","title":"Lightning.Credentials.Audit.base_query/0","doc":"","ref":"Lightning.Credentials.Audit.html#base_query/0"},{"type":"function","title":"Lightning.Credentials.Audit.event/4","doc":"","ref":"Lightning.Credentials.Audit.html#event/4"},{"type":"function","title":"Lightning.Credentials.Audit.save/1","doc":"","ref":"Lightning.Credentials.Audit.html#save/1"},{"type":"function","title":"Lightning.Credentials.Audit.update_changes/1","doc":"","ref":"Lightning.Credentials.Audit.html#update_changes/1"},{"type":"module","title":"Lightning.Credentials.Credential","doc":"The Credential model.","ref":"Lightning.Credentials.Credential.html"},{"type":"type","title":"Lightning.Credentials.Credential.t/0","doc":"","ref":"Lightning.Credentials.Credential.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.OauthClient","doc":"Defines the Ecto schema for an OAuth client. This schema is responsible for representing\nOAuth client data in the database, including details such as client ID, client secret,\nand endpoints necessary for OAuth operations. It also links to associated users and\nprojects through relational fields.","ref":"Lightning.Credentials.OauthClient.html"},{"type":"function","title":"Lightning.Credentials.OauthClient.changeset/2","doc":"Builds a changeset for an OAuth client based on the provided attributes.","ref":"Lightning.Credentials.OauthClient.html#changeset/2"},{"type":"function","title":"Parameters - Lightning.Credentials.OauthClient.changeset/2","doc":"- oauth_client: The existing `%OauthClient{}` struct (or a new struct for creation).\n- attrs: A map of attributes to set on the OAuth client.","ref":"Lightning.Credentials.OauthClient.html#changeset/2-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.OauthClient.changeset/2","doc":"- An `%Ecto.Changeset{}` that can be used to create or update an OAuth client.\n\nThis function validates the presence of essential fields, ensures that URLs are valid,\nand handles associations with projects through nested changesets.","ref":"Lightning.Credentials.OauthClient.html#changeset/2-returns"},{"type":"type","title":"Lightning.Credentials.OauthClient.t/0","doc":"","ref":"Lightning.Credentials.OauthClient.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.OauthClientAudit","doc":"Model for storing changes to Oauth clients","ref":"Lightning.Credentials.OauthClientAudit.html"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.base_query/0","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#base_query/0"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.event/4","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#event/4"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.save/1","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#save/1"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.update_changes/1","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#update_changes/1"},{"type":"module","title":"Lightning.Credentials.Schema","doc":"Structure that can parse JsonSchemas (using `ExJsonSchema`) and validate\nchangesets for a given schema.","ref":"Lightning.Credentials.Schema.html"},{"type":"function","title":"Lightning.Credentials.Schema.new/2","doc":"","ref":"Lightning.Credentials.Schema.html#new/2"},{"type":"function","title":"Lightning.Credentials.Schema.properties/2","doc":"","ref":"Lightning.Credentials.Schema.html#properties/2"},{"type":"function","title":"Lightning.Credentials.Schema.required?/2","doc":"","ref":"Lightning.Credentials.Schema.html#required?/2"},{"type":"function","title":"Lightning.Credentials.Schema.validate/2","doc":"","ref":"Lightning.Credentials.Schema.html#validate/2"},{"type":"type","title":"Lightning.Credentials.Schema.t/0","doc":"","ref":"Lightning.Credentials.Schema.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.SchemaDocument","doc":"Provides facilities to dynamically create and validate a changeset for a given\n[Schema](`Lightning.Credentials.Schema`)","ref":"Lightning.Credentials.SchemaDocument.html"},{"type":"function","title":"Lightning.Credentials.SchemaDocument.changeset/3","doc":"","ref":"Lightning.Credentials.SchemaDocument.html#changeset/3"},{"type":"module","title":"Lightning.Credentials.SensitiveValues","doc":"Functions to pull out sensitive values inside a credential.\n\nThese values are used to scrub logs for leaked secrets.","ref":"Lightning.Credentials.SensitiveValues.html"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.flatten_map/1","doc":"Keys that are _not_ considered sensitive","ref":"Lightning.Credentials.SensitiveValues.html#flatten_map/1"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.secret_values/1","doc":"Given a map, find all values allowed (via `@safe_keys`) and return them as\na list.","ref":"Lightning.Credentials.SensitiveValues.html#secret_values/1"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:pairs/0"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.raw_pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:raw_pairs/0"},{"type":"module","title":"Lightning.Invocation","doc":"The Invocation context.","ref":"Lightning.Invocation.html"},{"type":"function","title":"Lightning.Invocation.assemble_logs_for_step/1","doc":"Return all logs for a step as a string of text, separated by new line \n breaks","ref":"Lightning.Invocation.html#assemble_logs_for_step/1"},{"type":"function","title":"Lightning.Invocation.change_dataclip/2","doc":"Returns an `%Ecto.Changeset{}` for tracking dataclip changes.","ref":"Lightning.Invocation.html#change_dataclip/2"},{"type":"function","title":"Examples - Lightning.Invocation.change_dataclip/2","doc":"iex> change_dataclip(dataclip)\n %Ecto.Changeset{data: %Dataclip{}}","ref":"Lightning.Invocation.html#change_dataclip/2-examples"},{"type":"function","title":"Lightning.Invocation.change_step/2","doc":"Returns an `%Ecto.Changeset{}` for tracking step changes.","ref":"Lightning.Invocation.html#change_step/2"},{"type":"function","title":"Examples - Lightning.Invocation.change_step/2","doc":"iex> change_step(step)\n %Ecto.Changeset{data: %Step{}}","ref":"Lightning.Invocation.html#change_step/2-examples"},{"type":"function","title":"Lightning.Invocation.count_workorders/2","doc":"","ref":"Lightning.Invocation.html#count_workorders/2"},{"type":"function","title":"Lightning.Invocation.create_dataclip/1","doc":"Creates a dataclip.","ref":"Lightning.Invocation.html#create_dataclip/1"},{"type":"function","title":"Examples - Lightning.Invocation.create_dataclip/1","doc":"iex> create_dataclip(%{field: value})\n {:ok, %Dataclip{}}\n\n iex> create_dataclip(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Invocation.html#create_dataclip/1-examples"},{"type":"function","title":"Lightning.Invocation.delete_dataclip/1","doc":"Deletes a dataclip.","ref":"Lightning.Invocation.html#delete_dataclip/1"},{"type":"function","title":"Examples - Lightning.Invocation.delete_dataclip/1","doc":"iex> delete_dataclip(dataclip)\n {:ok, %Dataclip{}}\n\n iex> delete_dataclip(dataclip)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Invocation.html#delete_dataclip/1-examples"},{"type":"function","title":"Lightning.Invocation.get_dataclip/1","doc":"Gets a single dataclip given one of:\n\n- a Dataclip uuid\n- a Step model\n\nReturns `nil` if the Dataclip does not exist.","ref":"Lightning.Invocation.html#get_dataclip/1"},{"type":"function","title":"Examples - Lightning.Invocation.get_dataclip/1","doc":"iex> get_dataclip(\"27b73932-16c7-4a72-86a3-85d805ccff98\")\n %Dataclip{}\n\n iex> get_dataclip(\"27b73932-16c7-4a72-86a3-85d805ccff98\")\n nil\n\n iex> get_dataclip(%Step{id: \"a uuid\"})\n %Dataclip{}","ref":"Lightning.Invocation.html#get_dataclip/1-examples"},{"type":"function","title":"Lightning.Invocation.get_dataclip!/1","doc":"Gets a single dataclip.\n\nRaises `Ecto.NoResultsError` if the Dataclip does not exist.","ref":"Lightning.Invocation.html#get_dataclip!/1"},{"type":"function","title":"Examples - Lightning.Invocation.get_dataclip!/1","doc":"iex> get_dataclip!(123)\n %Dataclip{}\n\n iex> get_dataclip!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_dataclip!/1-examples"},{"type":"function","title":"Lightning.Invocation.get_dataclip_details!/1","doc":"","ref":"Lightning.Invocation.html#get_dataclip_details!/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip_for_run/1","doc":"","ref":"Lightning.Invocation.html#get_dataclip_for_run/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip_query/1","doc":"Query for retrieving the dataclip that was step's starting dataclip.","ref":"Lightning.Invocation.html#get_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_first_dataclip_for_run_and_job/2","doc":"","ref":"Lightning.Invocation.html#get_first_dataclip_for_run_and_job/2"},{"type":"function","title":"Lightning.Invocation.get_first_step_for_run_and_job/2","doc":"","ref":"Lightning.Invocation.html#get_first_step_for_run_and_job/2"},{"type":"function","title":"Lightning.Invocation.get_output_dataclip_query/1","doc":"Query for retrieving the dataclip that was the result of a successful step.","ref":"Lightning.Invocation.html#get_output_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_step!/1","doc":"Gets a single step.\n\nRaises `Ecto.NoResultsError` if the Step does not exist.","ref":"Lightning.Invocation.html#get_step!/1"},{"type":"function","title":"Examples - Lightning.Invocation.get_step!/1","doc":"iex> get_step!(123)\n %Step{}\n\n iex> get_step!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_step!/1-examples"},{"type":"function","title":"Lightning.Invocation.get_step_count_for_run/1","doc":"","ref":"Lightning.Invocation.html#get_step_count_for_run/1"},{"type":"function","title":"Lightning.Invocation.get_step_with_job!/1","doc":"Fetches a step and preloads the job via the step's event.","ref":"Lightning.Invocation.html#get_step_with_job!/1"},{"type":"function","title":"Lightning.Invocation.get_workorders_by_ids/1","doc":"","ref":"Lightning.Invocation.html#get_workorders_by_ids/1"},{"type":"function","title":"Lightning.Invocation.get_workorders_count_limit/0","doc":"","ref":"Lightning.Invocation.html#get_workorders_count_limit/0"},{"type":"function","title":"Lightning.Invocation.list_dataclips/0","doc":"Returns the list of dataclips.","ref":"Lightning.Invocation.html#list_dataclips/0"},{"type":"function","title":"Examples - Lightning.Invocation.list_dataclips/0","doc":"iex> list_dataclips()\n [%Dataclip{}, ...]","ref":"Lightning.Invocation.html#list_dataclips/0-examples"},{"type":"function","title":"Lightning.Invocation.list_dataclips/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_for_job/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_for_job/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_query/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_query/1"},{"type":"function","title":"Lightning.Invocation.list_steps/0","doc":"Returns the list of steps.","ref":"Lightning.Invocation.html#list_steps/0"},{"type":"function","title":"Examples - Lightning.Invocation.list_steps/0","doc":"iex> list_steps()\n [%Step{}, ...]","ref":"Lightning.Invocation.html#list_steps/0-examples"},{"type":"function","title":"Lightning.Invocation.list_steps_for_project/2","doc":"","ref":"Lightning.Invocation.html#list_steps_for_project/2"},{"type":"function","title":"Lightning.Invocation.list_steps_for_project_query/1","doc":"","ref":"Lightning.Invocation.html#list_steps_for_project_query/1"},{"type":"function","title":"Lightning.Invocation.logs_for_step/1","doc":"Return all logs for a step as a list","ref":"Lightning.Invocation.html#logs_for_step/1"},{"type":"function","title":"Lightning.Invocation.search_workorders/1","doc":"Searches for work orders based on project and search parameters.","ref":"Lightning.Invocation.html#search_workorders/1"},{"type":"function","title":"Parameters: - Lightning.Invocation.search_workorders/1","doc":"- `project`: The project to filter the work orders by.\n- `search_params`: The parameters to guide the search.","ref":"Lightning.Invocation.html#search_workorders/1-parameters"},{"type":"function","title":"Returns: - Lightning.Invocation.search_workorders/1","doc":"A paginated list of work orders that match the criteria.","ref":"Lightning.Invocation.html#search_workorders/1-returns"},{"type":"function","title":"Example: - Lightning.Invocation.search_workorders/1","doc":"search_workorders(%Project{id: 1}, %SearchParams{status: [\"completed\"]})","ref":"Lightning.Invocation.html#search_workorders/1-example"},{"type":"function","title":"Lightning.Invocation.search_workorders/3","doc":"","ref":"Lightning.Invocation.html#search_workorders/3"},{"type":"function","title":"Lightning.Invocation.search_workorders_for_export_query/2","doc":"","ref":"Lightning.Invocation.html#search_workorders_for_export_query/2"},{"type":"function","title":"Lightning.Invocation.search_workorders_for_retry/2","doc":"","ref":"Lightning.Invocation.html#search_workorders_for_retry/2"},{"type":"function","title":"Lightning.Invocation.update_dataclip/2","doc":"Updates a dataclip.","ref":"Lightning.Invocation.html#update_dataclip/2"},{"type":"function","title":"Examples - Lightning.Invocation.update_dataclip/2","doc":"iex> update_dataclip(dataclip, %{field: new_value})\n {:ok, %Dataclip{}}\n\n iex> update_dataclip(dataclip, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Invocation.html#update_dataclip/2-examples"},{"type":"function","title":"Lightning.Invocation.with_runs/1","doc":"","ref":"Lightning.Invocation.html#with_runs/1"},{"type":"module","title":"Lightning.Invocation.Dataclip","doc":"Ecto model for Dataclips.\n\nDataclips represent some data that arrived in the system, and records both\nthe data and the source of the data.","ref":"Lightning.Invocation.Dataclip.html"},{"type":"module","title":"Types - Lightning.Invocation.Dataclip","doc":"* `:http_request`\n The data arrived via a webhook.\n* `:global`\n Was created manually, and is intended to be used multiple times.\n When repetitive static data is needed to be maintained, instead of hard-coding\n into a Job - a more convenient solution is to create a `:global` Dataclip\n and access it inside the Job.\n* `:step_result`\n The final state of a step.\n* `:saved_input`\n An arbitrary input, created by a user. (Only configuration will be overwritten.)","ref":"Lightning.Invocation.Dataclip.html#module-types"},{"type":"function","title":"Lightning.Invocation.Dataclip.new/1","doc":"","ref":"Lightning.Invocation.Dataclip.html#new/1"},{"type":"function","title":"Lightning.Invocation.Dataclip.source_types/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#source_types/0"},{"type":"function","title":"Lightning.Invocation.Dataclip.validate_by_type/1","doc":"Append validations based on the type of the Dataclip.\n\n- `:step_result` must have an associated Step model.","ref":"Lightning.Invocation.Dataclip.html#validate_by_type/1"},{"type":"type","title":"Lightning.Invocation.Dataclip.source_type/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:source_type/0"},{"type":"type","title":"Lightning.Invocation.Dataclip.t/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.LogLine","doc":"Ecto model for run logs.\n\nEvery log line from a worker is stored using this model.\n\nCurrently the `:message` field is a text field, however the worker sends\nmessages in a JSON format. We will at some point consider changing this to\na JSON field; but for now we coerce it into a string.\n\nSee [`LogMessage`](`Lightning.LogMessage`) for more information.","ref":"Lightning.Invocation.LogLine.html"},{"type":"function","title":"Lightning.Invocation.LogLine.new/3","doc":"","ref":"Lightning.Invocation.LogLine.html#new/3"},{"type":"function","title":"Lightning.Invocation.LogLine.validate/2","doc":"","ref":"Lightning.Invocation.LogLine.html#validate/2"},{"type":"type","title":"Lightning.Invocation.LogLine.t/0","doc":"","ref":"Lightning.Invocation.LogLine.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.Query","doc":"Query functions for working with Steps and Dataclips","ref":"Lightning.Invocation.Query.html"},{"type":"function","title":"Lightning.Invocation.Query.any_step/0","doc":"To be used in preloads for `workflow > job > step` when the presence of any\nstep is all the information we need. As in, \"Does this job have any steps?\"","ref":"Lightning.Invocation.Query.html#any_step/0"},{"type":"function","title":"Lightning.Invocation.Query.dataclip_with_body/0","doc":"By default, the dataclip body is not returned via a query. This query selects\nthe body specifically.","ref":"Lightning.Invocation.Query.html#dataclip_with_body/0"},{"type":"function","title":"Lightning.Invocation.Query.last_n_for_job/2","doc":"","ref":"Lightning.Invocation.Query.html#last_n_for_job/2"},{"type":"function","title":"Lightning.Invocation.Query.last_step_for_job/1","doc":"The last step for a job","ref":"Lightning.Invocation.Query.html#last_step_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.last_successful_step_for_job/1","doc":"The last successful step for a job, used in scheduler to enable downstream runs\nto access a previous run's state","ref":"Lightning.Invocation.Query.html#last_successful_step_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.select_as_input/1","doc":"Returns a dataclip formatted for use as an input state.\n\nOnly `http_request` dataclips are changed, their `body` is nested inside a\n`\"data\"` key and `request` data is added as a `\"request\"` key.","ref":"Lightning.Invocation.Query.html#select_as_input/1"},{"type":"function","title":"Lightning.Invocation.Query.steps_for/1","doc":"Steps for a specific user","ref":"Lightning.Invocation.Query.html#steps_for/1"},{"type":"function","title":"Lightning.Invocation.Query.steps_with_reason/2","doc":"The last step for a job for a particular exit reason, used in scheduler","ref":"Lightning.Invocation.Query.html#steps_with_reason/2"},{"type":"function","title":"Lightning.Invocation.Query.wipe_dataclips/1","doc":"","ref":"Lightning.Invocation.Query.html#wipe_dataclips/1"},{"type":"module","title":"Lightning.Invocation.Step","doc":"Ecto model for Steps.\n\nA step is part of a run and represents the work initiated for a single\nJob with a single `input_dataclip`.\n\nOnce completed (successfully) it will have an `output_dataclip` associated\nwith it as well.\n\nWhen a step finishes, it's `:exit_reason` is set to one of following strings:\n\n- `\"success\"`\n- `\"fail\"`\n- `\"crash\"`\n- `\"cancel\"`\n- `\"kill\"`\n- `\"exception\"`\n- `\"lost\"`","ref":"Lightning.Invocation.Step.html"},{"type":"function","title":"Lightning.Invocation.Step.finished/2","doc":"","ref":"Lightning.Invocation.Step.html#finished/2"},{"type":"function","title":"Lightning.Invocation.Step.new/1","doc":"","ref":"Lightning.Invocation.Step.html#new/1"},{"type":"function","title":"Lightning.Invocation.Step.validate/1","doc":"","ref":"Lightning.Invocation.Step.html#validate/1"},{"type":"type","title":"Lightning.Invocation.Step.t/0","doc":"","ref":"Lightning.Invocation.Step.html#t:t/0"},{"type":"module","title":"Lightning.Jobs","doc":"The Jobs context.","ref":"Lightning.Jobs.html"},{"type":"function","title":"Lightning.Jobs.change_job/2","doc":"Returns an `%Ecto.Changeset{}` for tracking job changes.","ref":"Lightning.Jobs.html#change_job/2"},{"type":"function","title":"Examples - Lightning.Jobs.change_job/2","doc":"iex> change_job(job)\n %Ecto.Changeset{data: %Job{}}","ref":"Lightning.Jobs.html#change_job/2-examples"},{"type":"function","title":"Lightning.Jobs.create_job/1","doc":"Creates a job.","ref":"Lightning.Jobs.html#create_job/1"},{"type":"function","title":"Examples - Lightning.Jobs.create_job/1","doc":"iex> create_job(%{field: value})\n {:ok, %Job{}}\n\n iex> create_job(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Jobs.html#create_job/1-examples"},{"type":"function","title":"Lightning.Jobs.get_downstream_jobs_for/2","doc":"Returns the list of downstream jobs for a given job, optionally matching a\nspecific trigger type.\nWhen downstream_jobs_for is called without a trigger that means its between jobs\nwhen it called with a trigger that means we are starting from outside the pipeline","ref":"Lightning.Jobs.html#get_downstream_jobs_for/2"},{"type":"function","title":"Lightning.Jobs.get_job!/1","doc":"Gets a single job.\n\nRaises `Ecto.NoResultsError` if the Job does not exist.","ref":"Lightning.Jobs.html#get_job!/1"},{"type":"function","title":"Examples - Lightning.Jobs.get_job!/1","doc":"iex> get_job!(123)\n %Job{}\n\n iex> get_job!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Jobs.html#get_job!/1-examples"},{"type":"function","title":"Lightning.Jobs.get_job_with_credential/1","doc":"","ref":"Lightning.Jobs.html#get_job_with_credential/1"},{"type":"function","title":"Lightning.Jobs.get_upstream_jobs_for/1","doc":"Returns the list of jobs excluding the one given.","ref":"Lightning.Jobs.html#get_upstream_jobs_for/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project_query/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project_query/1"},{"type":"function","title":"Lightning.Jobs.list_active_cron_jobs/0","doc":"","ref":"Lightning.Jobs.html#list_active_cron_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs/0","doc":"Returns the list of jobs.","ref":"Lightning.Jobs.html#list_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs_for_workflow/1","doc":"","ref":"Lightning.Jobs.html#list_jobs_for_workflow/1"},{"type":"function","title":"Lightning.Jobs.update_job/2","doc":"Updates a job.","ref":"Lightning.Jobs.html#update_job/2"},{"type":"function","title":"Examples - Lightning.Jobs.update_job/2","doc":"iex> update_job(job, %{field: new_value})\n {:ok, %Job{}}\n\n iex> update_job(job, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Jobs.html#update_job/2-examples"},{"type":"module","title":"Lightning.Projects","doc":"The Projects context.","ref":"Lightning.Projects.html"},{"type":"function","title":"Lightning.Projects.add_project_users/3","doc":"","ref":"Lightning.Projects.html#add_project_users/3"},{"type":"function","title":"Lightning.Projects.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Projects.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Projects.change_project/2","doc":"Returns an `%Ecto.Changeset{}` for tracking project changes.","ref":"Lightning.Projects.html#change_project/2"},{"type":"function","title":"Examples - Lightning.Projects.change_project/2","doc":"iex> change_project(project)\n %Ecto.Changeset{data: %Project{}}","ref":"Lightning.Projects.html#change_project/2-examples"},{"type":"function","title":"Lightning.Projects.create_project/2","doc":"Creates a project.","ref":"Lightning.Projects.html#create_project/2"},{"type":"function","title":"Examples - Lightning.Projects.create_project/2","doc":"iex> create_project(%{field: value})\n {:ok, %Project{}}\n\n iex> create_project(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#create_project/2-examples"},{"type":"function","title":"Lightning.Projects.delete_project/1","doc":"Deletes a project and its related data, including workflows, work orders,\nsteps, jobs, runs, triggers, project users, project credentials, and dataclips","ref":"Lightning.Projects.html#delete_project/1"},{"type":"function","title":"Examples - Lightning.Projects.delete_project/1","doc":"iex> delete_project(project)\n {:ok, %Project{}}\n\n iex> delete_project(project)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#delete_project/1-examples"},{"type":"function","title":"Lightning.Projects.delete_project_user!/1","doc":"","ref":"Lightning.Projects.html#delete_project_user!/1"},{"type":"function","title":"Lightning.Projects.export_project/3","doc":"Exports a project as yaml.","ref":"Lightning.Projects.html#export_project/3"},{"type":"function","title":"Examples - Lightning.Projects.export_project/3","doc":"iex> export_project(:yaml, project_id)\n {:ok, string}","ref":"Lightning.Projects.html#export_project/3-examples"},{"type":"function","title":"Lightning.Projects.get_project/1","doc":"","ref":"Lightning.Projects.html#get_project/1"},{"type":"function","title":"Lightning.Projects.get_project!/1","doc":"Gets a single project.\n\nRaises `Ecto.NoResultsError` if the Project does not exist.","ref":"Lightning.Projects.html#get_project!/1"},{"type":"function","title":"Examples - Lightning.Projects.get_project!/1","doc":"iex> get_project!(123)\n %Project{}\n\n iex> get_project!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project!/1-examples"},{"type":"function","title":"Lightning.Projects.get_project_credential/2","doc":"","ref":"Lightning.Projects.html#get_project_credential/2"},{"type":"function","title":"Lightning.Projects.get_project_user/1","doc":"","ref":"Lightning.Projects.html#get_project_user/1"},{"type":"function","title":"Lightning.Projects.get_project_user/2","doc":"","ref":"Lightning.Projects.html#get_project_user/2"},{"type":"function","title":"Lightning.Projects.get_project_user!/1","doc":"Gets a single project_user.\n\nRaises `Ecto.NoResultsError` if the ProjectUser does not exist.","ref":"Lightning.Projects.html#get_project_user!/1"},{"type":"function","title":"Examples - Lightning.Projects.get_project_user!/1","doc":"iex> get_project_user!(123)\n %ProjectUser{}\n\n iex> get_project_user!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_user!/1-examples"},{"type":"function","title":"Lightning.Projects.get_project_user_role/2","doc":"Returns the role of a user in a project.\nPossible roles are :admin, :viewer, :editor, and :owner","ref":"Lightning.Projects.html#get_project_user_role/2"},{"type":"function","title":"Examples - Lightning.Projects.get_project_user_role/2","doc":"iex> get_project_user_role(user, project)\n :admin\n\n iex> get_project_user_role(user, project)\n :viewer\n\n iex> get_project_user_role(user, project)\n :editor\n\n iex> get_project_user_role(user, project)\n :owner","ref":"Lightning.Projects.html#get_project_user_role/2-examples"},{"type":"function","title":"Lightning.Projects.get_project_users!/1","doc":"Get all project users for a given project","ref":"Lightning.Projects.html#get_project_users!/1"},{"type":"function","title":"Lightning.Projects.get_project_with_users!/1","doc":"Gets a single project with it's members via `project_users`.\n\nRaises `Ecto.NoResultsError` if the Project does not exist.","ref":"Lightning.Projects.html#get_project_with_users!/1"},{"type":"function","title":"Examples - Lightning.Projects.get_project_with_users!/1","doc":"iex> get_project!(123)\n %Project{}\n\n iex> get_project!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_with_users!/1-examples"},{"type":"function","title":"Lightning.Projects.get_projects_for_user/2","doc":"Fetches projects for a given user from the database.","ref":"Lightning.Projects.html#get_projects_for_user/2"},{"type":"function","title":"Parameters - Lightning.Projects.get_projects_for_user/2","doc":"- user: The user struct for which projects are being queried.\n- opts: Keyword list of options including :include for associations to preload and :order_by for sorting.","ref":"Lightning.Projects.html#get_projects_for_user/2-parameters"},{"type":"function","title":"Returns - Lightning.Projects.get_projects_for_user/2","doc":"- A list of projects associated with the user.","ref":"Lightning.Projects.html#get_projects_for_user/2-returns"},{"type":"function","title":"Lightning.Projects.invite_collaborators/3","doc":"","ref":"Lightning.Projects.html#invite_collaborators/3"},{"type":"function","title":"Lightning.Projects.list_project_admin_emails/1","doc":"Lists emails of users with `:owner` or `:admin` roles in the project","ref":"Lightning.Projects.html#list_project_admin_emails/1"},{"type":"function","title":"Lightning.Projects.list_project_credentials/1","doc":"","ref":"Lightning.Projects.html#list_project_credentials/1"},{"type":"function","title":"Lightning.Projects.list_project_files/2","doc":"","ref":"Lightning.Projects.html#list_project_files/2"},{"type":"function","title":"Lightning.Projects.list_projects/0","doc":"Returns the list of projects.","ref":"Lightning.Projects.html#list_projects/0"},{"type":"function","title":"Examples - Lightning.Projects.list_projects/0","doc":"iex> list_projects()\n [%Project{}, ...]","ref":"Lightning.Projects.html#list_projects/0-examples"},{"type":"function","title":"Lightning.Projects.list_projects_having_history_retention/0","doc":"Lists all projects that have history retention","ref":"Lightning.Projects.html#list_projects_having_history_retention/0"},{"type":"function","title":"Lightning.Projects.member_of?/2","doc":"","ref":"Lightning.Projects.html#member_of?/2"},{"type":"function","title":"Lightning.Projects.perform/1","doc":"Perform, when called with %{\"type\" => \"purge_deleted\"}\nwill find projects that are ready for permanent deletion and purge them.","ref":"Lightning.Projects.html#perform/1"},{"type":"function","title":"Lightning.Projects.project_credentials_query/1","doc":"","ref":"Lightning.Projects.html#project_credentials_query/1"},{"type":"function","title":"Lightning.Projects.project_dataclips_query/1","doc":"","ref":"Lightning.Projects.html#project_dataclips_query/1"},{"type":"function","title":"Lightning.Projects.project_jobs_query/1","doc":"","ref":"Lightning.Projects.html#project_jobs_query/1"},{"type":"function","title":"Lightning.Projects.project_run_step_query/1","doc":"","ref":"Lightning.Projects.html#project_run_step_query/1"},{"type":"function","title":"Lightning.Projects.project_runs_query/1","doc":"","ref":"Lightning.Projects.html#project_runs_query/1"},{"type":"function","title":"Lightning.Projects.project_steps_query/1","doc":"","ref":"Lightning.Projects.html#project_steps_query/1"},{"type":"function","title":"Lightning.Projects.project_triggers_query/1","doc":"","ref":"Lightning.Projects.html#project_triggers_query/1"},{"type":"function","title":"Lightning.Projects.project_user_role_query/2","doc":"","ref":"Lightning.Projects.html#project_user_role_query/2"},{"type":"function","title":"Lightning.Projects.project_users_query/1","doc":"","ref":"Lightning.Projects.html#project_users_query/1"},{"type":"function","title":"Lightning.Projects.project_workflows_query/1","doc":"","ref":"Lightning.Projects.html#project_workflows_query/1"},{"type":"function","title":"Lightning.Projects.project_workorders_query/1","doc":"","ref":"Lightning.Projects.html#project_workorders_query/1"},{"type":"function","title":"Lightning.Projects.projects_for_user_query/2","doc":"Builds a query to retrieve projects associated with a user.","ref":"Lightning.Projects.html#projects_for_user_query/2"},{"type":"function","title":"Parameters - Lightning.Projects.projects_for_user_query/2","doc":"- user: The user struct for which projects are being queried.\n - opts: Keyword list of options including :include for associations to preload and :order_by for sorting.","ref":"Lightning.Projects.html#projects_for_user_query/2-parameters"},{"type":"function","title":"Returns - Lightning.Projects.projects_for_user_query/2","doc":"- An Ecto queryable struct to fetch projects.","ref":"Lightning.Projects.html#projects_for_user_query/2-returns"},{"type":"function","title":"Lightning.Projects.save_dataclips?/1","doc":"Should input or output dataclips be saved for runs in this project?","ref":"Lightning.Projects.html#save_dataclips?/1"},{"type":"function","title":"Lightning.Projects.schedule_project_deletion/1","doc":"Given a project, this function sets a scheduled deletion\ndate based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is\nset, this date defaults to NOW but the automatic project purge cronjob will\nnever run. (Note that subsequent logins will be blocked for projects pending\ndeletion.)","ref":"Lightning.Projects.html#schedule_project_deletion/1"},{"type":"function","title":"Lightning.Projects.select_first_project_for_user/1","doc":"","ref":"Lightning.Projects.html#select_first_project_for_user/1"},{"type":"function","title":"Lightning.Projects.update_project/2","doc":"Updates a project.","ref":"Lightning.Projects.html#update_project/2"},{"type":"function","title":"Examples - Lightning.Projects.update_project/2","doc":"iex> update_project(project, %{field: new_value})\n {:ok, %Project{}}\n\n iex> update_project(project, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#update_project/2-examples"},{"type":"function","title":"Lightning.Projects.update_project_user/2","doc":"Updates a project user.","ref":"Lightning.Projects.html#update_project_user/2"},{"type":"function","title":"Examples - Lightning.Projects.update_project_user/2","doc":"iex> update_project_user(project_user, %{field: new_value})\n {:ok, %ProjectUser{}}\n\n iex> update_project_user(projectUser, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#update_project_user/2-examples"},{"type":"function","title":"Lightning.Projects.update_project_with_users/3","doc":"","ref":"Lightning.Projects.html#update_project_with_users/3"},{"type":"function","title":"Lightning.Projects.url_safe_project_name/1","doc":"","ref":"Lightning.Projects.html#url_safe_project_name/1"},{"type":"function","title":"Lightning.Projects.validate_for_deletion/2","doc":"Returns an `%Ecto.Changeset{}` for changing the project scheduled_deletion.","ref":"Lightning.Projects.html#validate_for_deletion/2"},{"type":"function","title":"Examples - Lightning.Projects.validate_for_deletion/2","doc":"iex> validate_for_deletion(project)\n %Ecto.Changeset{data: %Project{}}","ref":"Lightning.Projects.html#validate_for_deletion/2-examples"},{"type":"module","title":"Lightning.Projects.Events","doc":"Events for Projects changes.","ref":"Lightning.Projects.Events.html"},{"type":"function","title":"Lightning.Projects.Events.project_created/1","doc":"","ref":"Lightning.Projects.Events.html#project_created/1"},{"type":"function","title":"Lightning.Projects.Events.project_deleted/1","doc":"","ref":"Lightning.Projects.Events.html#project_deleted/1"},{"type":"function","title":"Lightning.Projects.Events.subscribe/0","doc":"","ref":"Lightning.Projects.Events.html#subscribe/0"},{"type":"module","title":"Lightning.Projects.File","doc":"The project files module","ref":"Lightning.Projects.File.html"},{"type":"function","title":"Lightning.Projects.File.mark_failed/1","doc":"","ref":"Lightning.Projects.File.html#mark_failed/1"},{"type":"function","title":"Lightning.Projects.File.new/1","doc":"Creates a new file changeset.\n\nUnlike regular changeset functions, this expects atom keys and the project\nand user to be passed in as models.","ref":"Lightning.Projects.File.html#new/1"},{"type":"type","title":"Lightning.Projects.File.t/0","doc":"","ref":"Lightning.Projects.File.html#t:t/0"},{"type":"module","title":"Lightning.Projects.Project","doc":"Project model","ref":"Lightning.Projects.Project.html"},{"type":"function","title":"Lightning.Projects.Project.deletion_changeset/2","doc":"Changeset to validate a project deletion request, the user must enter the\nprojects name to confirm.","ref":"Lightning.Projects.Project.html#deletion_changeset/2"},{"type":"function","title":"Lightning.Projects.Project.project_with_users_changeset/2","doc":"","ref":"Lightning.Projects.Project.html#project_with_users_changeset/2"},{"type":"function","title":"Lightning.Projects.Project.validate/1","doc":"","ref":"Lightning.Projects.Project.html#validate/1"},{"type":"type","title":"Lightning.Projects.Project.retention_policy_type/0","doc":"","ref":"Lightning.Projects.Project.html#t:retention_policy_type/0"},{"type":"type","title":"Lightning.Projects.Project.t/0","doc":"","ref":"Lightning.Projects.Project.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectCredential","doc":"Join table to assign credentials to a project","ref":"Lightning.Projects.ProjectCredential.html"},{"type":"type","title":"Lightning.Projects.ProjectCredential.t/0","doc":"","ref":"Lightning.Projects.ProjectCredential.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectOauthClient","doc":"Manages the relationship between OAuth clients and projects, acting as a join table.\nThis module defines the schema and validations needed for creating and managing\nassociations between `OauthClient` and `Project`. It ensures that an OAuth client\ncan be associated with a project, facilitating the management of access permissions\nand settings specific to a project.","ref":"Lightning.Projects.ProjectOauthClient.html"},{"type":"module","title":"Schema Information - Lightning.Projects.ProjectOauthClient","doc":"The schema represents the bridge between projects and OAuth clients with the following fields:\n\n- `:id`: The unique identifier for the association, automatically generated.\n- `:oauth_client_id`: Foreign key to link with the OAuth client.\n- `:project_id`: Foreign key to link with the project.\n\nThis module also includes a virtual field `:delete` to mark an association for deletion,\naiding in operations that require soft deletion patterns or special handling before\nactually removing an association.","ref":"Lightning.Projects.ProjectOauthClient.html#module-schema-information"},{"type":"module","title":"Usage - Lightning.Projects.ProjectOauthClient","doc":"The primary function of this module is to create and manage changesets for adding or\nremoving OAuth clients from projects, ensuring data integrity and enforcing business\nrules such as uniqueness of the association.","ref":"Lightning.Projects.ProjectOauthClient.html#module-usage"},{"type":"function","title":"Lightning.Projects.ProjectOauthClient.changeset/2","doc":"Creates or updates changesets for a `ProjectOauthClient` entity based on the given attributes.\nValidates required fields and applies a unique constraint to ensure an OAuth client\ncan be associated with a project only once.\n\nThis changeset is used for adding new or updating existing associations between an OAuth client and a project.","ref":"Lightning.Projects.ProjectOauthClient.html#changeset/2"},{"type":"type","title":"Lightning.Projects.ProjectOauthClient.t/0","doc":"","ref":"Lightning.Projects.ProjectOauthClient.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser","doc":"Join table to assign users to a project","ref":"Lightning.Projects.ProjectUser.html"},{"type":"type","title":"Lightning.Projects.ProjectUser.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.DigestEnum","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.cast/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.dump/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.embed_as/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.equal?/2","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.load/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.DigestEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.RolesEnum","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.cast/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.dump/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.embed_as/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.equal?/2","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.load/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.RolesEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.Provisioner","doc":"Provides functions for importing projects. This module is used by the\nprovisioning HTTP API.\n\nWhen providing a project to import, all records must have an `id` field.\nIt's up to the caller to ensure that the `id` is unique and generated\nahead of time in the case of new records.","ref":"Lightning.Projects.Provisioner.html"},{"type":"function","title":"Lightning.Projects.Provisioner.import_document/3","doc":"Import a project.","ref":"Lightning.Projects.Provisioner.html#import_document/3"},{"type":"function","title":"Lightning.Projects.Provisioner.parse_document/2","doc":"","ref":"Lightning.Projects.Provisioner.html#parse_document/2"},{"type":"function","title":"Lightning.Projects.Provisioner.preload_dependencies/2","doc":"Preload all dependencies for a project.\n\nExclude deleted workflows.","ref":"Lightning.Projects.Provisioner.html#preload_dependencies/2"},{"type":"function","title":"Lightning.Projects.Provisioner.validate_extraneous_params/1","doc":"Validate that there are no extraneous parameters in the changeset.\n\nFor all params in the changeset, ensure that the param is in the list of\nknown fields in the schema.","ref":"Lightning.Projects.Provisioner.html#validate_extraneous_params/1"},{"type":"module","title":"Lightning.Runtime.LogAgent","doc":"Agent facility to consume STDOUT/STDERR byte by byte.\n\nSince it works on a byte by byte basis, you will need to perform line-splitting\nyourself.\n\nUsage:\n\n```\n{:ok, log} = LogAgent.start_link()\n\"foo\" = LogAgent.process_chunk(log, {:stdout, \"foo\"})\n\"foobar\" = LogAgent.process_chunk(log, {:stdout, \"bar\"})\n```","ref":"Lightning.Runtime.LogAgent.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Runtime.LogAgent.html#child_spec/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.start_link/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#start_link/1"},{"type":"type","title":"Lightning.Runtime.LogAgent.logline/0","doc":"","ref":"Lightning.Runtime.LogAgent.html#t:logline/0"},{"type":"module","title":"Lightning.Runtime.LogAgent.StringBuffer","doc":"Internal datastructure to hold and process new bytes for a list of\ncharacters.\n\nBy checking the if the buffer is a complete grapheme, emitting the buffer\nonce valid and returning `nil` otherwise.\n\nIn the case of emojis and other language character sets, a character\n(in UTF-8) can be between 1-4 bytes - when streaming logs for example\nit's quite easy to receive less than the whole character which can\nresult in crashes or corrupt text.","ref":"Lightning.Runtime.LogAgent.StringBuffer.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.new/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#new/0"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.reduce_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#reduce_chunk/2"},{"type":"type","title":"Lightning.Runtime.LogAgent.StringBuffer.t/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.RuntimeManager","doc":"Locates and runs the Runtime server. Added in order to ease development and default installations of Lightning\n\n# https://registry.npmjs.org/lightning-runtime/latest","ref":"Lightning.Runtime.RuntimeManager.html"},{"type":"module","title":"Runtime configuration - Lightning.Runtime.RuntimeManager","doc":"Sample:\n\n config :lightining, Elixir.Lightning.Runtime.RuntimeManager,\n version: \"0.1.0\",\n start: true,\n args: ~w(js/app.js --bundle --target=es2016 --outdir=../priv/static/assets),\n cd: Path.expand(\"../assets\", __DIR__),\n env: %{}\n\nOptions:\n\n * `:version` - the expected runtime version\n\n * `:start` - flag to start the runtime manager. If `false` the GenServer\n won't be started\n\n * `:path` - the path to find the runtime executable at. By\n default, it is automatically downloaded and placed inside\n the `_build` directory of your current app\n\nOverriding the `:path` is not recommended, as we will automatically\ndownload and manage the `runtime` for you.","ref":"Lightning.Runtime.RuntimeManager.html#module-runtime-configuration"},{"type":"function","title":"Lightning.Runtime.RuntimeManager.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Runtime.RuntimeManager.html#child_spec/1"},{"type":"function","title":"Lightning.Runtime.RuntimeManager.start_link/1","doc":"","ref":"Lightning.Runtime.RuntimeManager.html#start_link/1"},{"type":"behaviour","title":"Lightning.Runtime.RuntimeManager.RuntimeClient","doc":"Behaviour for runtime clients to improve testability.","ref":"Lightning.Runtime.RuntimeManager.RuntimeClient.html"},{"type":"callback","title":"Lightning.Runtime.RuntimeManager.RuntimeClient.start_runtime/1","doc":"","ref":"Lightning.Runtime.RuntimeManager.RuntimeClient.html#c:start_runtime/1"},{"type":"callback","title":"Lightning.Runtime.RuntimeManager.RuntimeClient.stop_runtime/1","doc":"","ref":"Lightning.Runtime.RuntimeManager.RuntimeClient.html#c:stop_runtime/1"},{"type":"module","title":"Lightning.Workflows","doc":"The Workflows context.","ref":"Lightning.Workflows.html"},{"type":"function","title":"Lightning.Workflows.build_trigger/1","doc":"Builds a Trigger","ref":"Lightning.Workflows.html#build_trigger/1"},{"type":"function","title":"Lightning.Workflows.capture_snapshot/1","doc":"Creates a snapshot from a multi.\n\nWhen the multi already has a `:workflow` change, it is assumed to be changed\nor inserted and will attempt to build and insert a new snapshot.\n\nWhen there isn't a `:workflow` change, it tries to find a dependant model\nlike a Job, Trigger or Edge and uses the workflow associated with that\nmodel.\n\nIn this case we assume that the workflow wasn't actually updated,\n`Workflow.touch()` is called to bump the `updated_at` and the `lock_version`\nof the workflow before a snapshot is captured.","ref":"Lightning.Workflows.html#capture_snapshot/1"},{"type":"function","title":"Lightning.Workflows.change_workflow/2","doc":"Returns an `%Ecto.Changeset{}` for tracking workflow changes.","ref":"Lightning.Workflows.html#change_workflow/2"},{"type":"function","title":"Examples - Lightning.Workflows.change_workflow/2","doc":"iex> change_workflow(workflow)\n %Ecto.Changeset{data: %Workflow{}}","ref":"Lightning.Workflows.html#change_workflow/2-examples"},{"type":"function","title":"Lightning.Workflows.create_edge/1","doc":"Creates an edge","ref":"Lightning.Workflows.html#create_edge/1"},{"type":"function","title":"Lightning.Workflows.get_edge_by_trigger/1","doc":"Gets an `Edge` by its associated `Trigger`.","ref":"Lightning.Workflows.html#get_edge_by_trigger/1"},{"type":"function","title":"Parameters - Lightning.Workflows.get_edge_by_trigger/1","doc":"- `%Trigger{id: trigger_id}`: A `Trigger` struct from which the associated `Edge` is to be found.","ref":"Lightning.Workflows.html#get_edge_by_trigger/1-parameters"},{"type":"function","title":"Returns - Lightning.Workflows.get_edge_by_trigger/1","doc":"- Returns an `Edge` struct preloaded with its `source_trigger` and `target_job` if found.\n- Returns `nil` if no `Edge` is associated with the given `Trigger`.","ref":"Lightning.Workflows.html#get_edge_by_trigger/1-returns"},{"type":"function","title":"Examples - Lightning.Workflows.get_edge_by_trigger/1","doc":"```\ntrigger = %Trigger{id: 1, ...}\nLightning.Workflows.get_edge_by_trigger(trigger)\n# => %Edge{source_trigger: %Trigger{}, target_job: %Job{}, ...}\n\nnon_existent_trigger = %Trigger{id: 999, ...}\nLightning.Workflows.get_edge_by_trigger(non_existent_trigger)\n# => nil\n```","ref":"Lightning.Workflows.html#get_edge_by_trigger/1-examples"},{"type":"function","title":"Lightning.Workflows.get_edges_for_cron_execution/1","doc":"Returns a list of edges with jobs to execute, given a current timestamp in Unix. This is\nused by the scheduler, which calls this function once every minute.","ref":"Lightning.Workflows.html#get_edges_for_cron_execution/1"},{"type":"function","title":"Lightning.Workflows.get_trigger_by_webhook/1","doc":"Gets a single `Trigger` by its `custom_path` or `id`.","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1"},{"type":"function","title":"Parameters - Lightning.Workflows.get_trigger_by_webhook/1","doc":"- `path`: A binary string representing the `custom_path` or `id` of the trigger.","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1-parameters"},{"type":"function","title":"Returns - Lightning.Workflows.get_trigger_by_webhook/1","doc":"- Returns a `Trigger` struct if a trigger is found.\n- Returns `nil` if no trigger is found for the given `path`.","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1-returns"},{"type":"function","title":"Examples - Lightning.Workflows.get_trigger_by_webhook/1","doc":"```\nLightning.Workflows.get_trigger_by_webhook(\"some_path_or_id\")\n# => %Trigger{id: 1, custom_path: \"some_path_or_id\", ...}\n\nLightning.Workflows.get_trigger_by_webhook(\"non_existent_path_or_id\")\n# => nil\n```","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1-examples"},{"type":"function","title":"Lightning.Workflows.get_webhook_trigger/2","doc":"Gets a Single Edge by it's webhook trigger.","ref":"Lightning.Workflows.html#get_webhook_trigger/2"},{"type":"function","title":"Lightning.Workflows.get_workflow/1","doc":"","ref":"Lightning.Workflows.html#get_workflow/1"},{"type":"function","title":"Lightning.Workflows.get_workflow!/1","doc":"Gets a single workflow.\n\nRaises `Ecto.NoResultsError` if the Workflow does not exist.","ref":"Lightning.Workflows.html#get_workflow!/1"},{"type":"function","title":"Examples - Lightning.Workflows.get_workflow!/1","doc":"iex> get_workflow!(123)\n %Workflow{}\n\n iex> get_workflow!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Workflows.html#get_workflow!/1-examples"},{"type":"function","title":"Lightning.Workflows.get_workflows_for/1","doc":"Retrieves a list of active Workflows with their jobs and triggers preloaded.","ref":"Lightning.Workflows.html#get_workflows_for/1"},{"type":"function","title":"Lightning.Workflows.has_newer_version?/1","doc":"","ref":"Lightning.Workflows.html#has_newer_version?/1"},{"type":"function","title":"Lightning.Workflows.jobs_ordered_subquery/0","doc":"A way to ensure the consistency of nodes.\nThis query orders jobs based on their `inserted_at` timestamps in ascending order","ref":"Lightning.Workflows.html#jobs_ordered_subquery/0"},{"type":"function","title":"Lightning.Workflows.list_workflows/0","doc":"Returns the list of workflows.","ref":"Lightning.Workflows.html#list_workflows/0"},{"type":"function","title":"Examples - Lightning.Workflows.list_workflows/0","doc":"iex> list_workflows()\n [%Workflow{}, ...]","ref":"Lightning.Workflows.html#list_workflows/0-examples"},{"type":"function","title":"Lightning.Workflows.mark_for_deletion/2","doc":"Returns an `%Ecto.Changeset{}` for changing the workflow request_deletion.","ref":"Lightning.Workflows.html#mark_for_deletion/2"},{"type":"function","title":"Examples - Lightning.Workflows.mark_for_deletion/2","doc":"iex> change_request_deletion(workflow)\n %Ecto.Changeset{data: %Workflow{}}","ref":"Lightning.Workflows.html#mark_for_deletion/2-examples"},{"type":"function","title":"Lightning.Workflows.publish_kafka_trigger_events/1","doc":"","ref":"Lightning.Workflows.html#publish_kafka_trigger_events/1"},{"type":"function","title":"Lightning.Workflows.save_workflow/1","doc":"","ref":"Lightning.Workflows.html#save_workflow/1"},{"type":"function","title":"Lightning.Workflows.subscribe/1","doc":"","ref":"Lightning.Workflows.html#subscribe/1"},{"type":"function","title":"Lightning.Workflows.to_project_space/1","doc":"","ref":"Lightning.Workflows.html#to_project_space/1"},{"type":"function","title":"Lightning.Workflows.update_trigger/2","doc":"Updates a trigger","ref":"Lightning.Workflows.html#update_trigger/2"},{"type":"function","title":"Lightning.Workflows.workflow_exists?/2","doc":"Check if workflow exist","ref":"Lightning.Workflows.html#workflow_exists?/2"},{"type":"module","title":"Lightning.Workflows.Edge","doc":"Ecto model for Workflow Edges.\n\nA Workflow Edge represents a connection between two jobs\n(or a trigger and a job) in a workflow.\n\nThe source of the edge is either a job or a trigger.\nThe target of the edge is always a job.","ref":"Lightning.Workflows.Edge.html"},{"type":"function","title":"Lightning.Workflows.Edge.changeset/2","doc":"","ref":"Lightning.Workflows.Edge.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.Edge.new/1","doc":"","ref":"Lightning.Workflows.Edge.html#new/1"},{"type":"function","title":"Lightning.Workflows.Edge.validate/1","doc":"","ref":"Lightning.Workflows.Edge.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Edge.edge_condition/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:edge_condition/0"},{"type":"type","title":"Lightning.Workflows.Edge.t/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Job","doc":"Ecto model for Jobs.\n\nA Job contains the fields for defining a job.\n\n* `body`\n The expression/javascript code\n* `name`\n A plain text identifier\n* `adaptor`\n An NPM style string that contains both the module name and it's version.\n E.g. `@openfn/language-http@v1.2.3` or `@openfn/language-foo@latest`.\n While the version suffix isn't enforced here as it's not strictly necessary\n in this context, the front end will ensure a version is stated (`@latest`\n being the default).","ref":"Lightning.Workflows.Job.html"},{"type":"function","title":"Lightning.Workflows.Job.new/1","doc":"","ref":"Lightning.Workflows.Job.html#new/1"},{"type":"function","title":"Lightning.Workflows.Job.put_project_credential/2","doc":"","ref":"Lightning.Workflows.Job.html#put_project_credential/2"},{"type":"function","title":"Lightning.Workflows.Job.put_workflow/2","doc":"Attaches a workflow to a job, this is useful when you have an unpersisted\nWorkflow changeset - and want it to be created at the same time as a Job.\n\n\nExample:\n\n workflow =\n Ecto.Changeset.cast(\n %Lightning.Workflows.Workflow{},\n %{ \"project_id\" => attrs[:project_id], \"id\" => Ecto.UUID.generate() },\n [:project_id, :id]\n )\n\n job =\n %Job{}\n |> Ecto.Changeset.change()\n |> Job.put_workflow(workflow)\n |> Job.changeset(attrs)","ref":"Lightning.Workflows.Job.html#put_workflow/2"},{"type":"function","title":"Lightning.Workflows.Job.validate/1","doc":"","ref":"Lightning.Workflows.Job.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Job.t/0","doc":"","ref":"Lightning.Workflows.Job.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Node","doc":"Represents a node in a workflow graph.","ref":"Lightning.Workflows.Node.html"},{"type":"module","title":"Lightning.Workflows.Presence","doc":"Handles user presence tracking within the Workflow canvas page.\n\nThis module leverages Phoenix.Presence to track user sessions, manage user priorities,\nand list active presences on specified topics.","ref":"Lightning.Workflows.Presence.html"},{"type":"function","title":"Lightning.Workflows.Presence.build_presences_summary/2","doc":"Builds a summary of presences with details about the current user's presence, promotable presences,\nand edit priority.","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.build_presences_summary/2","doc":"- `presences` (list): A list of presence records, each containing user information and a joined_at timestamp.\n - `params` (map): A map containing the following keys:\n - `:current_user_presence` - The presence record for the current user.\n - `:current_user` - The current user record.\n - `:view_only_users_ids` - A list of user IDs who have view-only permissions.","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2-parameters"},{"type":"function","title":"Returns - Lightning.Workflows.Presence.build_presences_summary/2","doc":"- `map`: A map containing the following keys:\n - `:presences` - The sorted list of all presences.\n - `:prior_user_presence` - The presence record with edit priority.\n - `:current_user_presence` - The presence record for the current user.\n - `:has_presence_edit_priority` - A boolean indicating if the current user has edit priority.","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2-returns"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.build_presences_summary/2","doc":"iex> presences = [\n ...> %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n ...> %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},\n ...> %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}\n ...> ]\n iex> params = %{\n ...> current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n ...> current_user: %{id: 1},\n ...> view_only_users_ids: [2]\n ...> }\n iex> build_presences_summary(presences, params)\n %{\n presences: [\n %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},\n %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}\n ],\n prior_user_presence: %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1},\n current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n has_presence_edit_priority: true\n }","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2-examples"},{"type":"function","title":"Lightning.Workflows.Presence.child_spec/1","doc":"","ref":"Lightning.Workflows.Presence.html#child_spec/1"},{"type":"function","title":"Lightning.Workflows.Presence.fetch/2","doc":"","ref":"Lightning.Workflows.Presence.html#fetch/2"},{"type":"function","title":"Lightning.Workflows.Presence.fetchers_pids/0","doc":"","ref":"Lightning.Workflows.Presence.html#fetchers_pids/0"},{"type":"function","title":"Lightning.Workflows.Presence.get_by_key/2","doc":"","ref":"Lightning.Workflows.Presence.html#get_by_key/2"},{"type":"function","title":"Lightning.Workflows.Presence.list/1","doc":"","ref":"Lightning.Workflows.Presence.html#list/1"},{"type":"function","title":"Lightning.Workflows.Presence.list_presences/1","doc":"Lists all presences for a given topic.","ref":"Lightning.Workflows.Presence.html#list_presences/1"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.list_presences/1","doc":"- `topic`: The topic to list the presences for.","ref":"Lightning.Workflows.Presence.html#list_presences/1-parameters"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.list_presences/1","doc":"iex> Lightning.Workflows.Presence.list_presences(\"workflow:canvas\")\n [%Lightning.Workflows.Presence{user: %User{id: 1}, ...}, ...]","ref":"Lightning.Workflows.Presence.html#list_presences/1-examples"},{"type":"function","title":"Lightning.Workflows.Presence.new_user_presence/3","doc":"Creates a new `UserPresence` struct.","ref":"Lightning.Workflows.Presence.html#new_user_presence/3"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.new_user_presence/3","doc":"- `user`: The user data to be included in the presence.\n - `joined_at`: The timestamp when the user joined, in microseconds.\n - `active_sessions`: The number of active sessions for the user (default is 0).","ref":"Lightning.Workflows.Presence.html#new_user_presence/3-parameters"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.new_user_presence/3","doc":"iex> Lightning.Workflows.Presence.new_user_presence(%User{id: 1}, 1625597762000000)\n %Lightning.Workflows.Presence{\n user: %User{id: 1},\n joined_at: 1625597762000000,\n active_sessions: 0\n }","ref":"Lightning.Workflows.Presence.html#new_user_presence/3-examples"},{"type":"function","title":"Lightning.Workflows.Presence.track/3","doc":"","ref":"Lightning.Workflows.Presence.html#track/3"},{"type":"function","title":"Lightning.Workflows.Presence.track/4","doc":"","ref":"Lightning.Workflows.Presence.html#track/4"},{"type":"function","title":"Lightning.Workflows.Presence.track_user_presence/3","doc":"Tracks the presence of a user on a given topic.","ref":"Lightning.Workflows.Presence.html#track_user_presence/3"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.track_user_presence/3","doc":"- `user`: The user to be tracked.\n - `topic`: The topic to track the user on.\n - `pid`: The process identifier for the user's session.","ref":"Lightning.Workflows.Presence.html#track_user_presence/3-parameters"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.track_user_presence/3","doc":"iex> Lightning.Workflows.Presence.track_user_presence(%User{id: 1}, \"room:lobby\", self())\n :ok","ref":"Lightning.Workflows.Presence.html#track_user_presence/3-examples"},{"type":"function","title":"Lightning.Workflows.Presence.untrack/2","doc":"","ref":"Lightning.Workflows.Presence.html#untrack/2"},{"type":"function","title":"Lightning.Workflows.Presence.untrack/3","doc":"","ref":"Lightning.Workflows.Presence.html#untrack/3"},{"type":"function","title":"Lightning.Workflows.Presence.update/3","doc":"","ref":"Lightning.Workflows.Presence.html#update/3"},{"type":"function","title":"Lightning.Workflows.Presence.update/4","doc":"","ref":"Lightning.Workflows.Presence.html#update/4"},{"type":"module","title":"Lightning.Workflows.Query","doc":"Query module for finding Jobs.","ref":"Lightning.Workflows.Query.html"},{"type":"function","title":"Lightning.Workflows.Query.enabled_cron_jobs_by_edge/0","doc":"Returns active jobs with their cron triggers for use in the cron scheduling\nservice.","ref":"Lightning.Workflows.Query.html#enabled_cron_jobs_by_edge/0"},{"type":"function","title":"Lightning.Workflows.Query.jobs_for/1","doc":"Returns all jobs accessible to a user, via their projects\nor all jobs in a given project.","ref":"Lightning.Workflows.Query.html#jobs_for/1"},{"type":"module","title":"Lightning.Workflows.Scheduler","doc":"The Scheduler is responsible for finding jobs that are ready to run based on\ntheir cron schedule, and then running them.","ref":"Lightning.Workflows.Scheduler.html"},{"type":"function","title":"Lightning.Workflows.Scheduler.enqueue_cronjobs/0","doc":"Find and start any cronjobs that are scheduled to run for a given time\n(defaults to the current time).","ref":"Lightning.Workflows.Scheduler.html#enqueue_cronjobs/0"},{"type":"function","title":"Lightning.Workflows.Scheduler.enqueue_cronjobs/1","doc":"","ref":"Lightning.Workflows.Scheduler.html#enqueue_cronjobs/1"},{"type":"module","title":"Lightning.Workflows.Snapshot","doc":"Ecto model for Workflow Snapshots.\n\nSnapshots are a way to store the state of a workflow at a given point in time.","ref":"Lightning.Workflows.Snapshot.html"},{"type":"function","title":"Lightning.Workflows.Snapshot.build/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#build/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.create/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#create/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_all_by_ids/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_all_by_ids/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_all_for/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_all_for/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_by_version/2","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_by_version/2"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_current_for/1","doc":"Get the latest snapshot for a workflow, based on the lock_version.\n\nIt returns the latest snapshot regardless of the lock_version of the\nworkflow passed in. This is intentional to ensure that\n`get_or_create_latest_for/1` doesn't attempt to create a new snapshot if the\nworkflow has been updated elsewhere.","ref":"Lightning.Workflows.Snapshot.html#get_current_for/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_or_create_latest_for/1","doc":"Get the latest snapshot for a workflow, or create one if it doesn't exist.","ref":"Lightning.Workflows.Snapshot.html#get_or_create_latest_for/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_or_create_latest_for/3","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_or_create_latest_for/3"},{"type":"function","title":"Lightning.Workflows.Snapshot.new/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#new/1"},{"type":"type","title":"Lightning.Workflows.Snapshot.t/0","doc":"","ref":"Lightning.Workflows.Snapshot.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Snapshot.Edge","doc":"","ref":"Lightning.Workflows.Snapshot.Edge.html"},{"type":"module","title":"Lightning.Workflows.Snapshot.Job","doc":"","ref":"Lightning.Workflows.Snapshot.Job.html"},{"type":"module","title":"Lightning.Workflows.Snapshot.Trigger","doc":"","ref":"Lightning.Workflows.Snapshot.Trigger.html"},{"type":"module","title":"Lightning.Workflows.Trigger","doc":"Ecto model for Triggers.\n\nTriggers represent the criteria in which a Job might be invoked.","ref":"Lightning.Workflows.Trigger.html"},{"type":"module","title":"Types - Lightning.Workflows.Trigger","doc":"#","ref":"Lightning.Workflows.Trigger.html#module-types"},{"type":"module","title":"Webhook (default) - Lightning.Workflows.Trigger","doc":"A webhook trigger allows a Job to invoked (via `Lightning.Invocation`) when it's\nendpoint is called.","ref":"Lightning.Workflows.Trigger.html#module-webhook-default"},{"type":"function","title":"Lightning.Workflows.Trigger.new/1","doc":"","ref":"Lightning.Workflows.Trigger.html#new/1"},{"type":"function","title":"Lightning.Workflows.Trigger.validate/1","doc":"","ref":"Lightning.Workflows.Trigger.html#validate/1"},{"type":"function","title":"Lightning.Workflows.Trigger.with_auth_methods_query/0","doc":"","ref":"Lightning.Workflows.Trigger.html#with_auth_methods_query/0"},{"type":"type","title":"Lightning.Workflows.Trigger.t/0","doc":"","ref":"Lightning.Workflows.Trigger.html#t:t/0"},{"type":"type","title":"Lightning.Workflows.Trigger.trigger_type/0","doc":"","ref":"Lightning.Workflows.Trigger.html#t:trigger_type/0"},{"type":"module","title":"Lightning.Workflows.Triggers.Events","doc":"Responsible for the publishing of and subscription to trigger-related events.","ref":"Lightning.Workflows.Triggers.Events.html"},{"type":"function","title":"Lightning.Workflows.Triggers.Events.kafka_trigger_updated/1","doc":"","ref":"Lightning.Workflows.Triggers.Events.html#kafka_trigger_updated/1"},{"type":"function","title":"Lightning.Workflows.Triggers.Events.kafka_trigger_updated_topic/0","doc":"","ref":"Lightning.Workflows.Triggers.Events.html#kafka_trigger_updated_topic/0"},{"type":"function","title":"Lightning.Workflows.Triggers.Events.subscribe_to_kafka_trigger_updated/0","doc":"","ref":"Lightning.Workflows.Triggers.Events.html#subscribe_to_kafka_trigger_updated/0"},{"type":"module","title":"Lightning.Workflows.Triggers.KafkaConfiguration","doc":"Configuration of Kafka Triggers.","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.apply_hosts_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#apply_hosts_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.apply_topics_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#apply_topics_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.changeset/2","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.generate_hosts_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#generate_hosts_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.generate_topics_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#generate_topics_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.sasl_types/0","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#sasl_types/0"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.set_group_id_if_required/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#set_group_id_if_required/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.validate_initial_offset_reset_policy/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#validate_initial_offset_reset_policy/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.validate_sasl_credentials/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#validate_sasl_credentials/1"},{"type":"module","title":"Lightning.Workflows.WebhookAuthMethod","doc":"The `Lightning.Workflows.WebhookAuthMethod` module defines the schema for webhook authentication methods and provides functionalities to handle them.","ref":"Lightning.Workflows.WebhookAuthMethod.html"},{"type":"module","title":"Schema - Lightning.Workflows.WebhookAuthMethod","doc":"The schema represents a webhook authentication method that can be of two types - `:basic` and `:api`. The basic type requires a username and password, while the api type requires an api_key.\n\nThe schema fields include:\n - `name`: the name of the authentication method\n - `auth_type`: the type of authentication, can be `:basic` or `:api`\n - `username`: the username required for basic authentication\n - `password`: the password required for basic authentication (virtual field)\n - `hashed_password`: the hashed version of the password\n - `api_key`: the API key required for API authentication","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-schema"},{"type":"module","title":"Associations - Lightning.Workflows.WebhookAuthMethod","doc":"Each `WebhookAuthMethod` belongs to a `project`.\nIt is also associated with multiple `triggers` through a many_to_many relationship.","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-associations"},{"type":"module","title":"Validations and Constraints - Lightning.Workflows.WebhookAuthMethod","doc":"This module provides changeset functions for casting and validating the schema fields and applying unique constraints on `name`, `username`, and `api_key` within the project scope.","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-validations-and-constraints"},{"type":"module","title":"Password Verification - Lightning.Workflows.WebhookAuthMethod","doc":"The `valid_password?/2` function is provided to verify passwords and it avoids timing attacks by using `Bcrypt.no_user_verify/0` when there is no webhook_auth_method or the webhook_auth_method doesn't have a password.","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-password-verification"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethod.changeset/2","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethod.generate_api_key/1","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#generate_api_key/1"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethod.update_changeset/2","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#update_changeset/2"},{"type":"type","title":"Lightning.Workflows.WebhookAuthMethod.t/0","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.WebhookAuthMethodAudit","doc":"Model for storing changes to WebhookAuthMethod","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethodAudit.base_query/0","doc":"","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html#base_query/0"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethodAudit.event/4","doc":"","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html#event/4"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethodAudit.save/1","doc":"","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html#save/1"},{"type":"module","title":"Lightning.Workflows.Workflow","doc":"Ecto model for Workflows.\n\nA Workflow contains the fields for defining a workflow.\n\n* `name`\n A plain text identifier","ref":"Lightning.Workflows.Workflow.html"},{"type":"function","title":"Lightning.Workflows.Workflow.request_deletion_changeset/2","doc":"","ref":"Lightning.Workflows.Workflow.html#request_deletion_changeset/2"},{"type":"function","title":"Lightning.Workflows.Workflow.touch/1","doc":"Forces an update to the workflows `updated_at` timestamp and the\n`lock_version`. This is useful when updating a child record like jobs or\ntriggers and a snapshot needs to made; but the Workflow itself didn't change.","ref":"Lightning.Workflows.Workflow.html#touch/1"},{"type":"function","title":"Lightning.Workflows.Workflow.validate/1","doc":"","ref":"Lightning.Workflows.Workflow.html#validate/1"},{"type":"function","title":"Lightning.Workflows.Workflow.workflow_activated?/1","doc":"Returns true if the workflow has any triggers that are _going to be_ activated.\n\nNew triggers are enabled by default, but existing triggers are only considered\nactivated if their `enabled` field is _changed_ to `true`.","ref":"Lightning.Workflows.Workflow.html#workflow_activated?/1"},{"type":"type","title":"Lightning.Workflows.Workflow.t/0","doc":"","ref":"Lightning.Workflows.Workflow.html#t:t/0"},{"type":"module","title":"Lightning.LogMessage","doc":"A custom type to handle JSON log messages.\n\nCurrently the underlying database type is a string, and workers may send\neither a string, or a JSON object. This type will encode JSON objects to\nstring.\n\n> ##","ref":"Lightning.LogMessage.html"},{"type":"module","title":"Messages are always strings {: .info} - Lightning.LogMessage","doc":">\n> While this type allows JSON objects to be sent, the model will always return\n> strings. This type is a stand-in until we want to add a JSONB column to the\n> underlying table.\n\nIn the case of JSON objects we serialize them to a string, and in the case of\narrays we serialize them individually and join them with a space.","ref":"Lightning.LogMessage.html#module-messages-are-always-strings-info"},{"type":"function","title":"Lightning.LogMessage.cast/1","doc":"","ref":"Lightning.LogMessage.html#cast/1"},{"type":"function","title":"Lightning.LogMessage.dump/1","doc":"","ref":"Lightning.LogMessage.html#dump/1"},{"type":"function","title":"Lightning.LogMessage.embed_as/1","doc":"","ref":"Lightning.LogMessage.html#embed_as/1"},{"type":"function","title":"Lightning.LogMessage.equal?/2","doc":"","ref":"Lightning.LogMessage.html#equal?/2"},{"type":"function","title":"Lightning.LogMessage.load/1","doc":"","ref":"Lightning.LogMessage.html#load/1"},{"type":"function","title":"Lightning.LogMessage.type/0","doc":"","ref":"Lightning.LogMessage.html#type/0"},{"type":"module","title":"Lightning.UnixDateTime","doc":"A custom DateTime type for Ecto that uses millisecond Unix timestamps.\n\nNodeJS uses millisecond Unix timestamps, and Ecto has a choice of either\nsecond or microsecond precision. This module allows millisecond precision\nintegers to be used as DateTime values without losing precision.\n\nMicrosecond timestamps can also be parsed, but currently they are expected\nto be provided as strings. This is because Javascript can't represent\nmicrosecond timestamps as an integer and BigInt can't be represented\nas a JSON value.\n\nAll functions fallback on the default Ecto types conversion functions.","ref":"Lightning.UnixDateTime.html"},{"type":"function","title":"Lightning.UnixDateTime.cast/1","doc":"Cast a Unix timestamp to a DateTime.\n\nAccepts integers and strings, and will try to parse the string as an integer.\nIf the integer is 13 digits long, it will be parsed as a millisecond\ntimestamp, and as a microsecond timestamp if it is 16 digits long.","ref":"Lightning.UnixDateTime.html#cast/1"},{"type":"function","title":"Lightning.UnixDateTime.dump/1","doc":"","ref":"Lightning.UnixDateTime.html#dump/1"},{"type":"function","title":"Lightning.UnixDateTime.embed_as/1","doc":"","ref":"Lightning.UnixDateTime.html#embed_as/1"},{"type":"function","title":"Lightning.UnixDateTime.equal?/2","doc":"","ref":"Lightning.UnixDateTime.html#equal?/2"},{"type":"function","title":"Lightning.UnixDateTime.load/1","doc":"","ref":"Lightning.UnixDateTime.html#load/1"},{"type":"function","title":"Lightning.UnixDateTime.type/0","doc":"","ref":"Lightning.UnixDateTime.html#type/0"},{"type":"module","title":"LightningWeb","doc":"The entrypoint for defining your web interface, such\nas controllers, views, channels and so on.\n\nThis can be used in your application as:\n\n use LightningWeb, :controller\n use LightningWeb, :view\n\nThe definitions below will be executed for every view,\ncontroller, etc, so keep them short and clean, focused\non imports, uses and aliases.\n\nDo NOT define functions inside the quoted expressions\nbelow. Instead, define any helper function in modules\nand import those modules here.","ref":"LightningWeb.html"},{"type":"macro","title":"LightningWeb.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"LightningWeb.html#__using__/1"},{"type":"function","title":"LightningWeb.channel/0","doc":"","ref":"LightningWeb.html#channel/0"},{"type":"function","title":"LightningWeb.component/0","doc":"","ref":"LightningWeb.html#component/0"},{"type":"function","title":"LightningWeb.controller/0","doc":"","ref":"LightningWeb.html#controller/0"},{"type":"function","title":"LightningWeb.html/0","doc":"","ref":"LightningWeb.html#html/0"},{"type":"function","title":"LightningWeb.live_component/0","doc":"","ref":"LightningWeb.html#live_component/0"},{"type":"function","title":"LightningWeb.live_view/1","doc":"","ref":"LightningWeb.html#live_view/1"},{"type":"function","title":"LightningWeb.router/0","doc":"","ref":"LightningWeb.html#router/0"},{"type":"function","title":"LightningWeb.static_paths/0","doc":"","ref":"LightningWeb.html#static_paths/0"},{"type":"function","title":"LightningWeb.verified_routes/0","doc":"","ref":"LightningWeb.html#verified_routes/0"},{"type":"function","title":"LightningWeb.view/0","doc":"","ref":"LightningWeb.html#view/0"},{"type":"module","title":"LightningWeb.API.Helpers","doc":"Helpers for the API views","ref":"LightningWeb.API.Helpers.html"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_link/3","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_link/3"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_links/2","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_links/2"},{"type":"function","title":"LightningWeb.API.Helpers.url_for/2","doc":"","ref":"LightningWeb.API.Helpers.html#url_for/2"},{"type":"module","title":"LightningWeb.API.JobController","doc":"","ref":"LightningWeb.API.JobController.html"},{"type":"function","title":"LightningWeb.API.JobController.index/2","doc":"","ref":"LightningWeb.API.JobController.html#index/2"},{"type":"function","title":"LightningWeb.API.JobController.show/2","doc":"","ref":"LightningWeb.API.JobController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProjectController","doc":"","ref":"LightningWeb.API.ProjectController.html"},{"type":"function","title":"LightningWeb.API.ProjectController.index/2","doc":"","ref":"LightningWeb.API.ProjectController.html#index/2"},{"type":"function","title":"LightningWeb.API.ProjectController.show/2","doc":"","ref":"LightningWeb.API.ProjectController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProvisioningController","doc":"","ref":"LightningWeb.API.ProvisioningController.html"},{"type":"function","title":"LightningWeb.API.ProvisioningController.create/2","doc":"Creates or updates a project based on a JSON payload that may or may not\ncontain UUIDs for existing resources.","ref":"LightningWeb.API.ProvisioningController.html#create/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show/2","doc":"Returns a project \"state.json\", complete with UUIDs to enable idempotent\nproject deployments and updates to existing projects via the CLI.","ref":"LightningWeb.API.ProvisioningController.html#show/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show_yaml/2","doc":"Returns a description of the project as yaml. Same as the export project to\nyaml button (see Downloads Controller) but made for the API.","ref":"LightningWeb.API.ProvisioningController.html#show_yaml/2"},{"type":"module","title":"LightningWeb.API.RegistrationController","doc":"","ref":"LightningWeb.API.RegistrationController.html"},{"type":"function","title":"LightningWeb.API.RegistrationController.create/2","doc":"","ref":"LightningWeb.API.RegistrationController.html#create/2"},{"type":"module","title":"LightningWeb.AccountConfirmationModal","doc":"A LiveView component for displaying an account confirmation modal.\n\nThis component is responsible for informing users that access to their\naccounts, projects, and workflows is restricted until they confirm\ntheir account. It provides functionality to resend the confirmation\nemail and allows users to update their email address if needed.","ref":"LightningWeb.AccountConfirmationModal.html"},{"type":"module","title":"Features - LightningWeb.AccountConfirmationModal","doc":"- Displays a modal with instructions for account confirmation.\n- Allows users to resend the confirmation email.\n- Provides feedback when the confirmation email is successfully sent.\n- Allows users to navigate to the profile page to update their email address.","ref":"LightningWeb.AccountConfirmationModal.html#module-features"},{"type":"module","title":"Usage - LightningWeb.AccountConfirmationModal","doc":"Include this component in your LiveView template where you need to prompt\nusers to confirm their account. The component determines whether the modal\nshould be shown based on the current view context.","ref":"LightningWeb.AccountConfirmationModal.html#module-usage"},{"type":"module","title":"Examples - LightningWeb.AccountConfirmationModal","doc":"The component uses assigns to manage its state, including:\n\n- `:show_modal` - Determines if the modal should be visible.\n- `:email_sent` - Indicates if the confirmation email was successfully sent.","ref":"LightningWeb.AccountConfirmationModal.html#module-examples"},{"type":"module","title":"LightningWeb.AuditLive.Index","doc":"LiveView for listing Audit events","ref":"LightningWeb.AuditLive.Index.html"},{"type":"function","title":"LightningWeb.AuditLive.Index.diff/1","doc":"","ref":"LightningWeb.AuditLive.Index.html#diff/1"},{"type":"function","title":"LightningWeb.AuditLive.Index.render/1","doc":"","ref":"LightningWeb.AuditLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.AuthProvidersLive.FormComponent","doc":"Form Component for working with a single Job\n\nA Job's `adaptor` field is a combination of the module name and the version.\nIt's formatted as an NPM style string.\n\nThe form allows the user to select a module by name and then it's version,\nwhile the version dropdown itself references `adaptor` directly.\n\nMeaning the `adaptor_name` dropdown and assigns value is not persisted.","ref":"LightningWeb.AuthProvidersLive.FormComponent.html"},{"type":"module","title":"LightningWeb.AuthProvidersLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.AuthProvidersLive.Index.html"},{"type":"module","title":"LightningWeb.BackupCodesController","doc":"","ref":"LightningWeb.BackupCodesController.html"},{"type":"function","title":"LightningWeb.BackupCodesController.print/2","doc":"","ref":"LightningWeb.BackupCodesController.html#print/2"},{"type":"module","title":"LightningWeb.BackupCodesLive.Index","doc":"LiveView for user backup codes.","ref":"LightningWeb.BackupCodesLive.Index.html"},{"type":"function","title":"LightningWeb.BackupCodesLive.Index.render/1","doc":"","ref":"LightningWeb.BackupCodesLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ChangesetJSON","doc":"Renders changesets as JSON.","ref":"LightningWeb.ChangesetJSON.html"},{"type":"function","title":"LightningWeb.ChangesetJSON.error/1","doc":"","ref":"LightningWeb.ChangesetJSON.html#error/1"},{"type":"module","title":"LightningWeb.ChangesetView","doc":"","ref":"LightningWeb.ChangesetView.html"},{"type":"function","title":"LightningWeb.ChangesetView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ChangesetView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ChangesetView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ChangesetView.html#render/2"},{"type":"function","title":"LightningWeb.ChangesetView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"LightningWeb.ChangesetView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.ChannelHelpers","doc":"Helper functions for channels","ref":"LightningWeb.ChannelHelpers.html"},{"type":"function","title":"LightningWeb.ChannelHelpers.reply_with/2","doc":"","ref":"LightningWeb.ChannelHelpers.html#reply_with/2"},{"type":"module","title":"LightningWeb.Components.Loaders","doc":"UI component to render a pill to create tags.","ref":"LightningWeb.Components.Loaders.html"},{"type":"function","title":"LightningWeb.Components.Loaders.button_loader/1","doc":"","ref":"LightningWeb.Components.Loaders.html#button_loader/1"},{"type":"function","title":"Slots - LightningWeb.Components.Loaders.button_loader/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Loaders.html#button_loader/1-slots"},{"type":"function","title":"LightningWeb.Components.Loaders.offline_indicator/1","doc":"","ref":"LightningWeb.Components.Loaders.html#offline_indicator/1"},{"type":"function","title":"LightningWeb.Components.Loaders.text_ping_loader/1","doc":"","ref":"LightningWeb.Components.Loaders.html#text_ping_loader/1"},{"type":"function","title":"Slots - LightningWeb.Components.Loaders.text_ping_loader/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Loaders.html#text_ping_loader/1-slots"},{"type":"module","title":"LightningWeb.Components.Menu","doc":"Menu components to render menu items for project and user/profile pages.","ref":"LightningWeb.Components.Menu.html"},{"type":"function","title":"LightningWeb.Components.Menu.menu_item/1","doc":"","ref":"LightningWeb.Components.Menu.html#menu_item/1"},{"type":"function","title":"LightningWeb.Components.Menu.profile_items/1","doc":"","ref":"LightningWeb.Components.Menu.html#profile_items/1"},{"type":"function","title":"LightningWeb.Components.Menu.project_items/1","doc":"","ref":"LightningWeb.Components.Menu.html#project_items/1"},{"type":"module","title":"LightningWeb.Components.Modal","doc":"A modal component that can be used to display a modal on the page.\n\nThis currently isn't used anywhere but should be used in the future to\nreplace the existing modal implementations.","ref":"LightningWeb.Components.Modal.html"},{"type":"function","title":"LightningWeb.Components.Modal.hide_modal/2","doc":"","ref":"LightningWeb.Components.Modal.html#hide_modal/2"},{"type":"function","title":"LightningWeb.Components.Modal.modal/1","doc":"","ref":"LightningWeb.Components.Modal.html#modal/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Modal.modal/1","doc":"* `id` (`:string`) (required)\n* `show` (`:boolean`) - Defaults to `false`.\n* `type` (`:string`) - Defaults to `\"default\"`.\n* `position` (`:string`) - Defaults to `\"relative\"`.\n* `width` (`:string`) - Defaults to `\"max-w-3xl\"`.\n* `close_on_click_away` (`:boolean`) - Defaults to `true`.\n* `close_on_keydown` (`:boolean`) - Defaults to `true`.\n* `on_close` (`Phoenix.LiveView.JS`) - Defaults to `%Phoenix.LiveView.JS{ops: []}`.\n* `on_open` (`Phoenix.LiveView.JS`) - Defaults to `%Phoenix.LiveView.JS{ops: []}`.\n* Global attributes are accepted.","ref":"LightningWeb.Components.Modal.html#modal/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.Modal.modal/1","doc":"* `inner_block` (required)\n* `title`\n* `subtitle`\n* `footer` - Accepts attributes:\n\n * `class` (`:string`)","ref":"LightningWeb.Components.Modal.html#modal/1-slots"},{"type":"function","title":"LightningWeb.Components.Modal.modal_footer/1","doc":"","ref":"LightningWeb.Components.Modal.html#modal_footer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Modal.modal_footer/1","doc":"* `class` (`:any`) - Defaults to `\"\"`.","ref":"LightningWeb.Components.Modal.html#modal_footer/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.Modal.modal_footer/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Modal.html#modal_footer/1-slots"},{"type":"function","title":"LightningWeb.Components.Modal.show_modal/2","doc":"","ref":"LightningWeb.Components.Modal.html#show_modal/2"},{"type":"module","title":"LightningWeb.Components.NewInputs","doc":"A temporary module that will serve as a place to put new inputs that conform\nwith the newer CoreComponents conventions introduced in Phoenix 1.7.","ref":"LightningWeb.Components.NewInputs.html"},{"type":"function","title":"LightningWeb.Components.NewInputs.button/1","doc":"Renders a button.","ref":"LightningWeb.Components.NewInputs.html#button/1"},{"type":"function","title":"Examples - LightningWeb.Components.NewInputs.button/1","doc":"Send! \n Send!","ref":"LightningWeb.Components.NewInputs.html#button/1-examples"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.button/1","doc":"* `id` (`:string`) - Defaults to `\"\"`.\n* `type` (`:string`) - Defaults to `\"button\"`.\n* `class` (`:any`) - Defaults to `\"\"`.\n* `color_class` (`:any`) - Defaults to `\"bg-primary-600 hover:bg-primary-700 text-white focus:ring-primary-500 disabled:bg-primary-300\"`.\n* `tooltip` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"disabled\", \"form\", \"name\", \"value\"]`.","ref":"LightningWeb.Components.NewInputs.html#button/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.button/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.NewInputs.html#button/1-slots"},{"type":"function","title":"LightningWeb.Components.NewInputs.error/1","doc":"Generates a generic error message.","ref":"LightningWeb.Components.NewInputs.html#error/1"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.error/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.NewInputs.html#error/1-slots"},{"type":"function","title":"LightningWeb.Components.NewInputs.errors/1","doc":"Generic wrapper for rendering error messages in custom input components.","ref":"LightningWeb.Components.NewInputs.html#errors/1"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.errors/1","doc":"* `field` (`Phoenix.HTML.FormField`) (required)","ref":"LightningWeb.Components.NewInputs.html#errors/1-attributes"},{"type":"function","title":"LightningWeb.Components.NewInputs.input/1","doc":"Renders an input with label and error messages.\n\nA `Phoenix.HTML.FormField` may be passed as argument,\nwhich is used to retrieve the input name, id, and values.\nOtherwise all attributes may be passed explicitly.","ref":"LightningWeb.Components.NewInputs.html#input/1"},{"type":"function","title":"Types - LightningWeb.Components.NewInputs.input/1","doc":"This function accepts all HTML input types, considering that:\n\n * You may also set `type=\"select\"` to render a ` ` tag\n\n * `type=\"checkbox\"` is used exclusively to render boolean values\n\n * For live file uploads, see `Phoenix.Component.live_file_input/1`\n\nSee https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input\nfor more information.","ref":"LightningWeb.Components.NewInputs.html#input/1-types"},{"type":"function","title":"Examples - LightningWeb.Components.NewInputs.input/1","doc":"","ref":"LightningWeb.Components.NewInputs.html#input/1-examples"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.input/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `name` (`:any`)\n* `label` (`:string`) - Defaults to `nil`.\n* `value` (`:any`)\n* `type` (`:string`) - Defaults to `\"text\"`.\n* `field` (`Phoenix.HTML.FormField`) - a form field struct retrieved from the form, for example: @form[:email].\n* `errors` (`:list`) - Defaults to `[]`.\n* `checked` (`:boolean`) - the checked flag for checkbox inputs.\n* `checked_value` (`:any`) - the value to be sent when the checkbox is checked. Defaults to 'true'. Defaults to `\"true\"`.\n* `unchecked_value` (`:any`) - the value to be sent when the checkbox is unchecked, Defaults to 'false'. Defaults to `\"false\"`.\n* `hidden_input` (`:boolean`) - controls if this function will generate a hidden input to submit the unchecked value or not. Defaults to 'true'. Defaults to `true`.\n* `prompt` (`:string`) - the prompt for select inputs. Defaults to `nil`.\n* `options` (`:list`) - the options to pass to Phoenix.HTML.Form.options_for_select/2.\n* `multiple` (`:boolean`) - the multiple flag for select inputs. Defaults to `false`.\n* `button_placement` (`:string`) - Defaults to `nil`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `display_errors` (`:boolean`) - Defaults to `true`.\n* `tooltip` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"accept\", \"autocomplete\", \"capture\", \"cols\", \"disabled\", \"form\", \"list\", \"max\", \"maxlength\", \"min\", \"minlength\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"size\", \"step\"]`.","ref":"LightningWeb.Components.NewInputs.html#input/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.input/1","doc":"* `inner_block`","ref":"LightningWeb.Components.NewInputs.html#input/1-slots"},{"type":"function","title":"LightningWeb.Components.NewInputs.input_element/1","doc":"Renders an input element.\n\nThis function is used internally by `input/1` and generally should not\nbe used directly.\n\nIn the case of inputs that are different enough to warrant a new function,\nthis component can be used to maintain style consistency.","ref":"LightningWeb.Components.NewInputs.html#input_element/1"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.input_element/1","doc":"* `id` (`:string`) - Defaults to `nil`.\n* `name` (`:string`) (required)\n* `type` (`:string`) (required)\n* `value` (`:any`)\n* `errors` (`:list`) - Defaults to `[]`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"LightningWeb.Components.NewInputs.html#input_element/1-attributes"},{"type":"function","title":"LightningWeb.Components.NewInputs.label/1","doc":"Renders a label.","ref":"LightningWeb.Components.NewInputs.html#label/1"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.label/1","doc":"* `for` (`:any`) - Defaults to `nil`.\n* `class` (`:any`) - Defaults to `\"\"`.","ref":"LightningWeb.Components.NewInputs.html#label/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.label/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.NewInputs.html#label/1-slots"},{"type":"module","title":"LightningWeb.Components.Pills","doc":"UI component to render a pill to create tags.","ref":"LightningWeb.Components.Pills.html"},{"type":"function","title":"LightningWeb.Components.Pills.pill/1","doc":"","ref":"LightningWeb.Components.Pills.html#pill/1"},{"type":"function","title":"Slots - LightningWeb.Components.Pills.pill/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Pills.html#pill/1-slots"},{"type":"module","title":"LightningWeb.Components.Viewers","doc":"Components for rendering Logs and Dataclips.\n\n> ##","ref":"LightningWeb.Components.Viewers.html"},{"type":"module","title":"Scrolling can be tricky {: .info} - LightningWeb.Components.Viewers","doc":">\n> We seldom know how long a log or a dataclip will be, and we want to\n> be able to contain the element in a fixed height container.\n> In some situations wrapping the component in a `div` with `inline-flex`\n> class will help with scrolling.","ref":"LightningWeb.Components.Viewers.html#module-scrolling-can-be-tricky-info"},{"type":"function","title":"LightningWeb.Components.Viewers.dataclip_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#dataclip_viewer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.dataclip_viewer/1","doc":"* `id` (`:string`) (required)\n* `dataclip` (`:map`) (required)","ref":"LightningWeb.Components.Viewers.html#dataclip_viewer/1-attributes"},{"type":"function","title":"LightningWeb.Components.Viewers.log_viewer/1","doc":"Renders out a log line stream\n\nInternally it uses the `LogLineHighlight` hook to highlight the log line\nwith the `highlight_id` attribute.","ref":"LightningWeb.Components.Viewers.html#log_viewer/1"},{"type":"function","title":"Example - LightningWeb.Components.Viewers.log_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#log_viewer/1-example"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.log_viewer/1","doc":"* `id` (`:string`) (required)\n* `run_id` (`:string`) (required)\n* `run_state` (`:any`) (required)\n* `logs_empty?` (`:boolean`) (required)\n* `selected_step_id` (`:string`)\n* `class` (`:string`) - Additional classes to add to the log viewer container. Defaults to `nil`.","ref":"LightningWeb.Components.Viewers.html#log_viewer/1-attributes"},{"type":"function","title":"LightningWeb.Components.Viewers.step_dataclip_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#step_dataclip_viewer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.step_dataclip_viewer/1","doc":"* `id` (`:string`) (required)\n* `run_state` (`:any`) (required)\n* `class` (`:string`) - Additional classes to add to the log viewer container. Defaults to `nil`.\n* `step` (`:map`)\n* `dataclip` (`Lightning.Invocation.Dataclip`)\n* `input_or_output` (`:atom`) (required) - Must be one of `:input`, or `:output`.\n* `project_id` (`:string`) (required)\n* `admin_contacts` (`:list`) (required) - list of project admin emails.\n* `can_edit_data_retention` (`:boolean`) (required)","ref":"LightningWeb.Components.Viewers.html#step_dataclip_viewer/1-attributes"},{"type":"function","title":"LightningWeb.Components.Viewers.wiped_dataclip_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#wiped_dataclip_viewer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.wiped_dataclip_viewer/1","doc":"* `id` (`:string`) - Defaults to `nil`.\n* `input_or_output` (`:atom`) (required) - Must be one of `:input`, or `:output`.\n* `project_id` (`:string`) (required)\n* `admin_contacts` (`:list`) (required) - list of project admin emails.\n* `can_edit_data_retention` (`:boolean`) (required)","ref":"LightningWeb.Components.Viewers.html#wiped_dataclip_viewer/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.Viewers.wiped_dataclip_viewer/1","doc":"* `footer`","ref":"LightningWeb.Components.Viewers.html#wiped_dataclip_viewer/1-slots"},{"type":"module","title":"LightningWeb.CredentialLive.CredentialFormComponent","doc":"Form Component for working with a single Credential","ref":"LightningWeb.CredentialLive.CredentialFormComponent.html"},{"type":"module","title":"LightningWeb.CredentialLive.GenericOauthComponent","doc":"","ref":"LightningWeb.CredentialLive.GenericOauthComponent.html"},{"type":"module","title":"LightningWeb.CredentialLive.Helpers","doc":"This module provides helper functions for managing project associations\nwithin credential live views, allowing dynamic assignment and update\nof projects associations to credentials and / or oauth clients.","ref":"LightningWeb.CredentialLive.Helpers.html"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.filter_available_projects/2","doc":"Filters available projects to exclude any that are already selected.","ref":"LightningWeb.CredentialLive.Helpers.html#filter_available_projects/2"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.filter_available_projects/2","doc":"- `all_projects`: A list of all projects.\n- `selected_projects`: A list of currently selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#filter_available_projects/2-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.filter_available_projects/2","doc":"- A list of projects that are not selected.","ref":"LightningWeb.CredentialLive.Helpers.html#filter_available_projects/2-returns"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.handle_save_response/2","doc":"","ref":"LightningWeb.CredentialLive.Helpers.html#handle_save_response/2"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.prepare_projects_associations/3","doc":"Prepares a list of projects to be associated, updated, or removed based on the selected input.","ref":"LightningWeb.CredentialLive.Helpers.html#prepare_projects_associations/3"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.prepare_projects_associations/3","doc":"- `changeset`: The changeset from which projects are fetched.\n- `selected_projects`: A list of currently selected projects.\n- `assoc_key`: The key in the changeset data containing project associations.","ref":"LightningWeb.CredentialLive.Helpers.html#prepare_projects_associations/3-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.prepare_projects_associations/3","doc":"- A list of maps representing the projects to be deleted, added, or kept.","ref":"LightningWeb.CredentialLive.Helpers.html#prepare_projects_associations/3-returns"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.select_project/4","doc":"Selects a project to be added to the list of selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#select_project/4"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.select_project/4","doc":"- `project_id`: The ID of the project to select.\n- `projects`: All available projects.\n- `available_projects`: Projects that are available for selection.\n- `selected_projects`: Currently selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#select_project/4-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.select_project/4","doc":"- A map with the updated lists of selected and available projects.","ref":"LightningWeb.CredentialLive.Helpers.html#select_project/4-returns"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.unselect_project/3","doc":"Unselects a project from the list of selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#unselect_project/3"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.unselect_project/3","doc":"- `project_id`: The ID of the project to unselect.\n- `projects`: All projects available.\n- `selected_projects`: Currently selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#unselect_project/3-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.unselect_project/3","doc":"- A map with the updated lists of selected and available projects.","ref":"LightningWeb.CredentialLive.Helpers.html#unselect_project/3-returns"},{"type":"module","title":"LightningWeb.CredentialLive.Index","doc":"LiveView for listing and managing credentials","ref":"LightningWeb.CredentialLive.Index.html"},{"type":"function","title":"LightningWeb.CredentialLive.Index.delete_action/1","doc":"","ref":"LightningWeb.CredentialLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.CredentialLive.Index.handle_info/2","doc":"A generic handler for forwarding updates from PubSub","ref":"LightningWeb.CredentialLive.Index.html#handle_info/2"},{"type":"function","title":"LightningWeb.CredentialLive.Index.render/1","doc":"","ref":"LightningWeb.CredentialLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"* `form` (`:map`) (required)","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1-attributes"},{"type":"function","title":"Slots - LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"* `inner_block`","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1-slots"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.schema_input/1","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#schema_input/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.JsonSchemaBodyComponent.schema_input/1","doc":"* `form` (`:map`) (required)\n* `schema` (`:map`) (required)\n* `field` (`:any`) (required)","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#schema_input/1-attributes"},{"type":"module","title":"LightningWeb.CredentialLive.OauthClientFormComponent","doc":"Form Component for working with a single Credential","ref":"LightningWeb.CredentialLive.OauthClientFormComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.OauthClientFormComponent.global_client_checkbox/1","doc":"","ref":"LightningWeb.CredentialLive.OauthClientFormComponent.html#global_client_checkbox/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.OauthClientFormComponent.global_client_checkbox/1","doc":"* `form` (`:any`) (required)","ref":"LightningWeb.CredentialLive.OauthClientFormComponent.html#global_client_checkbox/1-attributes"},{"type":"module","title":"LightningWeb.CredentialLive.OauthComponent","doc":"","ref":"LightningWeb.CredentialLive.OauthComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.OauthComponent.fieldset/1","doc":"","ref":"LightningWeb.CredentialLive.OauthComponent.html#fieldset/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.OauthComponent.fieldset/1","doc":"* `form` (`:map`) (required)\n* `id` (`:string`) (required)\n* `update_body` (`:any`) (required)\n* `action` (`:any`) (required)\n* `scopes_changed` (`:boolean`) - Defaults to `false`.\n* `sandbox_changed` (`:boolean`) - Defaults to `false`.\n* `schema` (`:string`) (required)","ref":"LightningWeb.CredentialLive.OauthComponent.html#fieldset/1-attributes"},{"type":"function","title":"Slots - LightningWeb.CredentialLive.OauthComponent.fieldset/1","doc":"* `inner_block`","ref":"LightningWeb.CredentialLive.OauthComponent.html#fieldset/1-slots"},{"type":"module","title":"LightningWeb.CredentialLive.RawBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.RawBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"* `form` (`:map`) (required)","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1-attributes"},{"type":"function","title":"Slots - LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"* `inner_block`","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1-slots"},{"type":"module","title":"LightningWeb.DashboardLive.Components","doc":"","ref":"LightningWeb.DashboardLive.Components.html"},{"type":"function","title":"LightningWeb.DashboardLive.Components.user_projects_table/1","doc":"","ref":"LightningWeb.DashboardLive.Components.html#user_projects_table/1"},{"type":"module","title":"LightningWeb.DashboardLive.Index","doc":"","ref":"LightningWeb.DashboardLive.Index.html"},{"type":"module","title":"LightningWeb.DashboardLive.ProjectCreationModal","doc":"","ref":"LightningWeb.DashboardLive.ProjectCreationModal.html"},{"type":"module","title":"LightningWeb.DataclipController","doc":"","ref":"LightningWeb.DataclipController.html"},{"type":"function","title":"LightningWeb.DataclipController.show/2","doc":"","ref":"LightningWeb.DataclipController.html#show/2"},{"type":"module","title":"LightningWeb.DataclipLive.FormComponent","doc":"Form Component for working with a single dataclip","ref":"LightningWeb.DataclipLive.FormComponent.html"},{"type":"function","title":"LightningWeb.DataclipLive.FormComponent.render/1","doc":"","ref":"LightningWeb.DataclipLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.DataclipLive.Show","doc":"LiveView for showing a single dataclip.","ref":"LightningWeb.DataclipLive.Show.html"},{"type":"module","title":"LightningWeb.DownloadsController","doc":"","ref":"LightningWeb.DownloadsController.html"},{"type":"function","title":"LightningWeb.DownloadsController.download_project_yaml/2","doc":"","ref":"LightningWeb.DownloadsController.html#download_project_yaml/2"},{"type":"module","title":"LightningWeb.Endpoint","doc":"","ref":"LightningWeb.Endpoint.html"},{"type":"function","title":"LightningWeb.Endpoint.broadcast/3","doc":"","ref":"LightningWeb.Endpoint.html#broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast!/3","doc":"","ref":"LightningWeb.Endpoint.html#broadcast!/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from/4","doc":"","ref":"LightningWeb.Endpoint.html#broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from!/4","doc":"","ref":"LightningWeb.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"LightningWeb.Endpoint.call/2","doc":"","ref":"LightningWeb.Endpoint.html#call/2"},{"type":"function","title":"LightningWeb.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"LightningWeb.Endpoint.html#child_spec/1"},{"type":"function","title":"LightningWeb.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"LightningWeb.Endpoint.html#config/2"},{"type":"function","title":"LightningWeb.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"LightningWeb.Endpoint.html#config_change/2"},{"type":"function","title":"LightningWeb.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"LightningWeb.Endpoint.html#host/0"},{"type":"function","title":"LightningWeb.Endpoint.init/1","doc":"","ref":"LightningWeb.Endpoint.html#init/1"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast/3","doc":"","ref":"LightningWeb.Endpoint.html#local_broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast_from/4","doc":"","ref":"LightningWeb.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"LightningWeb.Endpoint.html#path/1"},{"type":"function","title":"LightningWeb.Endpoint.script_name/0","doc":"Generates the script name.","ref":"LightningWeb.Endpoint.html#script_name/0"},{"type":"function","title":"LightningWeb.Endpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"LightningWeb.Endpoint.html#server_info/1"},{"type":"function","title":"LightningWeb.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"LightningWeb.Endpoint.html#start_link/1"},{"type":"function","title":"LightningWeb.Endpoint.static_integrity/1","doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file\nin `priv/static`. Meant to be used for Subresource Integrity with CDNs.","ref":"LightningWeb.Endpoint.html#static_integrity/1"},{"type":"function","title":"LightningWeb.Endpoint.static_lookup/1","doc":"Returns a two item tuple with the first item being the `static_path`\nand the second item being the `static_integrity`.","ref":"LightningWeb.Endpoint.html#static_lookup/1"},{"type":"function","title":"LightningWeb.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"LightningWeb.Endpoint.html#static_path/1"},{"type":"function","title":"LightningWeb.Endpoint.static_url/0","doc":"Generates the static URL without any path information.\n\nIt uses the configuration under `:static_url` to generate\nsuch. It falls back to `:url` if `:static_url` is not set.","ref":"LightningWeb.Endpoint.html#static_url/0"},{"type":"function","title":"LightningWeb.Endpoint.struct_url/0","doc":"Generates the endpoint base URL but as a `URI` struct.\n\nIt uses the configuration under `:url` to generate such.\nUseful for manipulating the URL data and passing it to\nURL helpers.","ref":"LightningWeb.Endpoint.html#struct_url/0"},{"type":"function","title":"LightningWeb.Endpoint.subscribe/2","doc":"","ref":"LightningWeb.Endpoint.html#subscribe/2"},{"type":"function","title":"LightningWeb.Endpoint.unsubscribe/1","doc":"","ref":"LightningWeb.Endpoint.html#unsubscribe/1"},{"type":"function","title":"LightningWeb.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"LightningWeb.Endpoint.html#url/0"},{"type":"module","title":"LightningWeb.ErrorView","doc":"","ref":"LightningWeb.ErrorView.html"},{"type":"function","title":"LightningWeb.ErrorView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ErrorView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ErrorView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ErrorView.html#render/2"},{"type":"function","title":"LightningWeb.ErrorView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"LightningWeb.ErrorView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.FallbackController","doc":"Translates controller action results into valid `Plug.Conn` responses.\n\nSee `Phoenix.Controller.action_fallback/1` for more details.","ref":"LightningWeb.FallbackController.html"},{"type":"module","title":"LightningWeb.FirstSetupLive.Superuser","doc":"Superuser setup liveview\n\nAllows the creation on the first user in the system.\n\nIt has only one action: `:show`","ref":"LightningWeb.FirstSetupLive.Superuser.html"},{"type":"function","title":"LightningWeb.FirstSetupLive.Superuser.render/1","doc":"","ref":"LightningWeb.FirstSetupLive.Superuser.html#render/1"},{"type":"module","title":"LightningWeb.FormHelpers","doc":"Conveniences for building forms.","ref":"LightningWeb.FormHelpers.html"},{"type":"module","title":"LightningWeb.Gettext","doc":"A module providing Internationalization with a gettext-based API.\n\nBy using [Gettext](https://hexdocs.pm/gettext),\nyour module gains a set of macros for translations, for example:\n\n import LightningWeb.Gettext\n\n # Simple translation\n gettext(\"Here is the string to translate\")\n\n # Plural translation\n ngettext(\"Here is the string to translate\",\n \"Here are the strings to translate\",\n 3)\n\n # Domain-based translation\n dgettext(\"errors\", \"Here is the error message to translate\")\n\nSee the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.","ref":"LightningWeb.Gettext.html"},{"type":"macro","title":"LightningWeb.Gettext.dgettext/3","doc":"","ref":"LightningWeb.Gettext.html#dgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.dgettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#dgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.dngettext/5","doc":"","ref":"LightningWeb.Gettext.html#dngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.dngettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#dngettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext/4","doc":"","ref":"LightningWeb.Gettext.html#dpgettext/4"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#dpgettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext/6","doc":"","ref":"LightningWeb.Gettext.html#dpngettext/6"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext_noop/4","doc":"","ref":"LightningWeb.Gettext.html#dpngettext_noop/4"},{"type":"macro","title":"LightningWeb.Gettext.gettext/2","doc":"","ref":"LightningWeb.Gettext.html#gettext/2"},{"type":"macro","title":"LightningWeb.Gettext.gettext_comment/1","doc":"","ref":"LightningWeb.Gettext.html#gettext_comment/1"},{"type":"macro","title":"LightningWeb.Gettext.gettext_noop/1","doc":"","ref":"LightningWeb.Gettext.html#gettext_noop/1"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_bindings/2","doc":"","ref":"LightningWeb.Gettext.html#handle_missing_bindings/2"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_plural_translation/7","doc":"","ref":"LightningWeb.Gettext.html#handle_missing_plural_translation/7"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_translation/5","doc":"","ref":"LightningWeb.Gettext.html#handle_missing_translation/5"},{"type":"function","title":"LightningWeb.Gettext.lgettext/5","doc":"","ref":"LightningWeb.Gettext.html#lgettext/5"},{"type":"function","title":"LightningWeb.Gettext.lngettext/7","doc":"","ref":"LightningWeb.Gettext.html#lngettext/7"},{"type":"macro","title":"LightningWeb.Gettext.ngettext/4","doc":"","ref":"LightningWeb.Gettext.html#ngettext/4"},{"type":"macro","title":"LightningWeb.Gettext.ngettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#ngettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pgettext/3","doc":"","ref":"LightningWeb.Gettext.html#pgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.pgettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#pgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pngettext/5","doc":"","ref":"LightningWeb.Gettext.html#pngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.pngettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#pngettext_noop/3"},{"type":"module","title":"LightningWeb.HealthCheck","doc":"","ref":"LightningWeb.HealthCheck.html"},{"type":"function","title":"LightningWeb.HealthCheck.call/2","doc":"","ref":"LightningWeb.HealthCheck.html#call/2"},{"type":"function","title":"LightningWeb.HealthCheck.init/1","doc":"","ref":"LightningWeb.HealthCheck.html#init/1"},{"type":"module","title":"LightningWeb.Hooks","doc":"LiveView Hooks","ref":"LightningWeb.Hooks.html"},{"type":"function","title":"LightningWeb.Hooks.on_mount/4","doc":"Finds and assigns a project to the socket, if a user doesn't have access\nthey are redirected and shown a 'No Access' screen via a `:nav` flash message.\n\nThere is a fallthru function, when there is no `project_id` in the params -\nthis is for liveviews that may or may not have a `project_id` depending on\nusage - like `DashboardLive`.","ref":"LightningWeb.Hooks.html#on_mount/4"},{"type":"module","title":"LightningWeb.InitAssigns","doc":"Ensures common `assigns` are applied to all LiveViews attaching this hook.","ref":"LightningWeb.InitAssigns.html"},{"type":"function","title":"LightningWeb.InitAssigns.on_mount/4","doc":"","ref":"LightningWeb.InitAssigns.html#on_mount/4"},{"type":"module","title":"LightningWeb.JobLive.AdaptorPicker","doc":"Component allowing selecting an adaptor and it's version","ref":"LightningWeb.JobLive.AdaptorPicker.html"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.display_name_for_adaptor/1","doc":"Converts standard adaptor names into \"label\",\"value\" lists and returns\nnon-standard names as merely \"value\"; both can be passed directly into a\nselect option list.","ref":"LightningWeb.JobLive.AdaptorPicker.html#display_name_for_adaptor/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.get_adaptor_version_options/1","doc":"","ref":"LightningWeb.JobLive.AdaptorPicker.html#get_adaptor_version_options/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.render/1","doc":"","ref":"LightningWeb.JobLive.AdaptorPicker.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.AdaptorPicker.render/1","doc":"* `form` (`:map`) (required)\n* `on_change` (`:any`) - Defaults to `nil`.\n* `disabled` (`:boolean`) - Defaults to `false`.","ref":"LightningWeb.JobLive.AdaptorPicker.html#render/1-attributes"},{"type":"module","title":"LightningWeb.JobLive.CredentialPicker","doc":"Component allowing selecting a credential or creating a new one via a\nmodal.","ref":"LightningWeb.JobLive.CredentialPicker.html"},{"type":"function","title":"LightningWeb.JobLive.CredentialPicker.render/1","doc":"","ref":"LightningWeb.JobLive.CredentialPicker.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.CredentialPicker.render/1","doc":"* `form` (`:map`) (required)\n* `disabled` (`:boolean`) - Defaults to `false`.\n* `credentials` (`:list`) (required)\n* `on_change` (`:any`) - Defaults to `nil`.","ref":"LightningWeb.JobLive.CredentialPicker.html#render/1-attributes"},{"type":"module","title":"LightningWeb.JobLive.CronSetupComponent","doc":"A live component for managing cron setup in a form.\n\nThe `CronSetupComponent` provides an interactive form for configuring cron settings. It includes fields for specifying the frequency, minute, hour, weekday, monthday, and cron expression.","ref":"LightningWeb.JobLive.CronSetupComponent.html"},{"type":"module","title":"Usage - LightningWeb.JobLive.CronSetupComponent","doc":"1. Include the `CronSetupComponent` in your live view or template.\n2. Pass the necessary assigns to the component, such as `form`, `on_change`, and `disabled`.\n3. Handle the `cron_expression_change` event to capture changes in the form inputs.\n4. Use the updated `cron_expression` in your application logic.","ref":"LightningWeb.JobLive.CronSetupComponent.html#module-usage"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.build_cron_expression/2","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#build_cron_expression/2"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.frequency_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#frequency_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.get_cron_data/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#get_cron_data/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.hour_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#hour_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.minute_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#minute_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.monthday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#monthday_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.render/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.CronSetupComponent.render/1","doc":"* `id` (`:string`) (required)\n* `form` (`:map`) (required)\n* `on_change` (`:any`) (required)\n* `disabled` (`:boolean`) (required)","ref":"LightningWeb.JobLive.CronSetupComponent.html#render/1-attributes"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.time_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#time_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.weekday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#weekday_field/1"},{"type":"module","title":"LightningWeb.JobLive.JobBuilderComponents","doc":"","ref":"LightningWeb.JobLive.JobBuilderComponents.html"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.job_editor_component/1","doc":"","ref":"LightningWeb.JobLive.JobBuilderComponents.html#job_editor_component/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.JobBuilderComponents.job_editor_component/1","doc":"* `adaptor` (`:string`) (required)\n* `change_event` (`:string`) - Defaults to `\"job_body_changed\"`.\n* `disabled` (`:boolean`) - Defaults to `false`.\n* `disabled_message` (`:string`) (required)\n* `job_id` (`:string`) (required)\n* `source` (`:string`) (required)\n* Global attributes are accepted.","ref":"LightningWeb.JobLive.JobBuilderComponents.html#job_editor_component/1-attributes"},{"type":"module","title":"LightningWeb.JobLive.KafkaSetupComponent","doc":"","ref":"LightningWeb.JobLive.KafkaSetupComponent.html"},{"type":"function","title":"LightningWeb.JobLive.KafkaSetupComponent.render/1","doc":"","ref":"LightningWeb.JobLive.KafkaSetupComponent.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.KafkaSetupComponent.render/1","doc":"* `id` (`:string`) (required)\n* `form` (`:map`) (required)\n* `disabled` (`:boolean`) (required)","ref":"LightningWeb.JobLive.KafkaSetupComponent.html#render/1-attributes"},{"type":"module","title":"LightningWeb.LiveHelpers","doc":"General purpose LiveView helper functions","ref":"LightningWeb.LiveHelpers.html"},{"type":"function","title":"LightningWeb.LiveHelpers.check_limits/2","doc":"","ref":"LightningWeb.LiveHelpers.html#check_limits/2"},{"type":"function","title":"LightningWeb.LiveHelpers.display_short_uuid/1","doc":"","ref":"LightningWeb.LiveHelpers.html#display_short_uuid/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_in/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_in/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_out/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_out/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_error_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_error_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_info_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_info_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_nav_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_nav_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.upcase_first/1","doc":"","ref":"LightningWeb.LiveHelpers.html#upcase_first/1"},{"type":"module","title":"LightningWeb.ModalPortal","doc":"Component for rendering content inside layout without full DOM patch.","ref":"LightningWeb.ModalPortal.html"},{"type":"function","title":"LightningWeb.ModalPortal.close_modal/0","doc":"","ref":"LightningWeb.ModalPortal.html#close_modal/0"},{"type":"function","title":"LightningWeb.ModalPortal.handle_event/3","doc":"","ref":"LightningWeb.ModalPortal.html#handle_event/3"},{"type":"function","title":"LightningWeb.ModalPortal.on_hide/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_hide/2"},{"type":"function","title":"LightningWeb.ModalPortal.on_show/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_show/2"},{"type":"function","title":"LightningWeb.ModalPortal.open_modal/2","doc":"","ref":"LightningWeb.ModalPortal.html#open_modal/2"},{"type":"function","title":"LightningWeb.ModalPortal.render/1","doc":"","ref":"LightningWeb.ModalPortal.html#render/1"},{"type":"function","title":"LightningWeb.ModalPortal.update/2","doc":"","ref":"LightningWeb.ModalPortal.html#update/2"},{"type":"module","title":"LightningWeb.OauthController","doc":"","ref":"LightningWeb.OauthController.html"},{"type":"function","title":"LightningWeb.OauthController.new/2","doc":"","ref":"LightningWeb.OauthController.html#new/2"},{"type":"module","title":"LightningWeb.OauthCredentialHelper","doc":"A set of helper functions to encodes state and coordinate OAuth callbacks\nback to a LiveView component.","ref":"LightningWeb.OauthCredentialHelper.html"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast/2","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#broadcast/2"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast_forward/3","doc":"Broadcast a message specifically for forwarding a message to a component.\nIt expects a `subscription_id`, the module of the component and `opts`\nbeing a keyword list containing an `:id` key of the specific component.\n\nSee: `Phoenix.LiveView.send_update/3` for more info.\n\nA corresponding LiveView (that is subscribed) is expected to have a matching\n`handle_info/2` that looks like this:\n\n```\ndef handle_info({:forward, mod, opts}, socket) do\n send_update(mod, opts)\n {:noreply, socket}\nend\n```","ref":"LightningWeb.OauthCredentialHelper.html#broadcast_forward/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.build_state/3","doc":"Encode and encrypt the callback data which will be sent so a provider\nas the `state` key in the request.\n\nThe values are:\n\n- `subscription_id`\n The same ID used to subscribe.\n- The component module\n The LiveView component that is going to receive update\n- The component id\n The ID of the component","ref":"LightningWeb.OauthCredentialHelper.html#build_state/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.decode_state/1","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#decode_state/1"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.subscribe/1","doc":"Subscribe to the `oauth_credential` topic.\nIt expects the a unique ID for the topic, usually the LiveView's `socket.id`.","ref":"LightningWeb.OauthCredentialHelper.html#subscribe/1"},{"type":"module","title":"LightningWeb.OidcController","doc":"","ref":"LightningWeb.OidcController.html"},{"type":"function","title":"LightningWeb.OidcController.new/2","doc":"Once the user has completed the authorization flow from above, they are\nreturned here, and the authorization code is used to log them in.","ref":"LightningWeb.OidcController.html#new/2"},{"type":"function","title":"LightningWeb.OidcController.show/2","doc":"Given a known provider, redirect them to the authorize url on the provider","ref":"LightningWeb.OidcController.html#show/2"},{"type":"module","title":"LightningWeb.PageView","doc":"","ref":"LightningWeb.PageView.html"},{"type":"function","title":"LightningWeb.PageView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.PageView.html#__resource__/0"},{"type":"function","title":"LightningWeb.PageView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.PageView.html#render/2"},{"type":"function","title":"LightningWeb.PageView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"LightningWeb.PageView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.Pagination","doc":"Pagination Components\n\nThis has been extracted and adapted from `scrivener_html`.\nSee: https://github.com/mgwidmann/scrivener_html","ref":"LightningWeb.Pagination.html"},{"type":"function","title":"LightningWeb.Pagination.page_link/1","doc":"","ref":"LightningWeb.Pagination.html#page_link/1"},{"type":"function","title":"LightningWeb.Pagination.pagination_bar/1","doc":"","ref":"LightningWeb.Pagination.html#pagination_bar/1"},{"type":"function","title":"Attributes - LightningWeb.Pagination.pagination_bar/1","doc":"* `async_page` (`Phoenix.LiveView.AsyncResult`) - Defaults to `nil`.\n* `page` (`:map`) (required)\n* `url` (`:any`) (required)\n* `help_text` (`:string`) - Defaults to `nil`.","ref":"LightningWeb.Pagination.html#pagination_bar/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Pagination.pagination_bar/1","doc":"* `action`","ref":"LightningWeb.Pagination.html#pagination_bar/1-slots"},{"type":"function","title":"LightningWeb.Pagination.raw_pagination_links/2","doc":"Returns the raw data in order to generate the proper HTML for pagination links. Data\nis returned in a `{text, page_number}` format where `text` is intended to be the text\nof the link and `page_number` is the page it should go to. Defaults are already supplied\nand they are as follows:\n [distance: 5, next: :next, previous: :previous, first: true, last: true, ellipsis: :ellipsis]\n`distance` must be a positive non-zero integer or an exception is raised. `next` and `previous` should be\nstrings but can be anything you want as long as it is truthy, falsey values will remove\nthem from the output. `first` and `last` are only booleans, and they just include/remove\ntheir respective link from output. An example of the data returned:\n iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 10, page_number: 5})\n [{\" >\", 6}]\n iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 20, page_number: 10}, first: [\"←\"], last: [\"→\"])\n [{\" >\", 11}]\nSimply loop and pattern match over each item and transform it to your custom HTML.","ref":"LightningWeb.Pagination.html#raw_pagination_links/2"},{"type":"module","title":"LightningWeb.PlugConfigs","doc":"Dynamically initialize Plugs that don't accept dynamic configs in :prod ENV.","ref":"LightningWeb.PlugConfigs.html"},{"type":"function","title":"LightningWeb.PlugConfigs.plug_parsers/0","doc":"","ref":"LightningWeb.PlugConfigs.html#plug_parsers/0"},{"type":"module","title":"LightningWeb.Plugs.BlockRoutes","doc":"Plug to conditionally block specified routes based on configuration flags and custom messages.","ref":"LightningWeb.Plugs.BlockRoutes.html"},{"type":"module","title":"LightningWeb.Plugs.FirstSetup","doc":"Plug to redirect HTTP requests to `/first_setup` if there are no\nsuperusers in the system yet.","ref":"LightningWeb.Plugs.FirstSetup.html"},{"type":"module","title":"LightningWeb.Plugs.Redirect","doc":"A plug for redirecting requests to a specified URL.\n\nThis plug takes an option `:to` which specifies the target URL for the redirection.","ref":"LightningWeb.Plugs.Redirect.html"},{"type":"function","title":"LightningWeb.Plugs.Redirect.call/2","doc":"Redirects the connection to the specified URL.","ref":"LightningWeb.Plugs.Redirect.html#call/2"},{"type":"function","title":"Parameters - LightningWeb.Plugs.Redirect.call/2","doc":"- conn: The connection struct.\n - opts: A keyword list of options. Must include `:to` key specifying the target URL.","ref":"LightningWeb.Plugs.Redirect.html#call/2-parameters"},{"type":"function","title":"Examples - LightningWeb.Plugs.Redirect.call/2","doc":"iex> conn = %Plug.Conn{}\n iex> opts = [to: \"/new_path\"]\n iex> LightningWeb.Plugs.Redirect.call(conn, opts)\n %Plug.Conn{...}","ref":"LightningWeb.Plugs.Redirect.html#call/2-examples"},{"type":"function","title":"Raises - LightningWeb.Plugs.Redirect.call/2","doc":"`KeyError` if the `:to` key is not present in options.","ref":"LightningWeb.Plugs.Redirect.html#call/2-raises"},{"type":"function","title":"LightningWeb.Plugs.Redirect.init/1","doc":"Initializes the plug options.","ref":"LightningWeb.Plugs.Redirect.html#init/1"},{"type":"function","title":"Parameters - LightningWeb.Plugs.Redirect.init/1","doc":"- opts: A keyword list of options.","ref":"LightningWeb.Plugs.Redirect.html#init/1-parameters"},{"type":"function","title":"Returns - LightningWeb.Plugs.Redirect.init/1","doc":"The provided options are returned as they are.","ref":"LightningWeb.Plugs.Redirect.html#init/1-returns"},{"type":"function","title":"Examples - LightningWeb.Plugs.Redirect.init/1","doc":"iex> LightningWeb.Plugs.Redirect.init(to: \"/new_path\")\n [to: \"/new_path\"]","ref":"LightningWeb.Plugs.Redirect.html#init/1-examples"},{"type":"module","title":"LightningWeb.Plugs.WebhookAuth","doc":"A Plug to authenticate and authorize requests based on paths starting with '/i/'.\nIt verifies the presence of correct API keys or Basic Authentication credentials.","ref":"LightningWeb.Plugs.WebhookAuth.html"},{"type":"function","title":"LightningWeb.Plugs.WebhookAuth.call/2","doc":"Handles the incoming HTTP request and performs authentication and authorization checks\nbased on paths starting with `/i/`.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2"},{"type":"function","title":"Details - LightningWeb.Plugs.WebhookAuth.call/2","doc":"This function is the entry point for the `WebhookAuth` plug. It first checks if\nthe request path starts with `/i/` to determine whether the request should be processed\nby this plug.\n\nIf the path matches, it then extracts the `webhook` part from the request path and\nruns to fetch the corresponding `trigger` using the `fetch_trigger` function.\n\nIf a valid `trigger` is found, the function proceeds to validate the authentication\nof the request using the `validate_auth` function.\n\nIn case the `trigger` is not found, or the path does not start with `/i/`, the function\nreturns a 404 Not Found response with a JSON error message indicating that the webhook\nis not found.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-details"},{"type":"function","title":"Parameters - LightningWeb.Plugs.WebhookAuth.call/2","doc":"- `conn`: The connection struct representing the incoming HTTP request.\n- `_opts`: A set of options, not used in this function but is a mandatory parameter as per\n Plug specification.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-parameters"},{"type":"function","title":"Returns - LightningWeb.Plugs.WebhookAuth.call/2","doc":"- A connection struct representing the outgoing response, which can be a successful\n response, an unauthorized response, or a not found response, based on the evaluation\n of the above-mentioned conditions.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-returns"},{"type":"function","title":"Examples - LightningWeb.Plugs.WebhookAuth.call/2","doc":"Assuming a request with the path `/i/some_webhook`:\n\n#","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-examples"},{"type":"function","title":"Webhook Found and Authenticated - LightningWeb.Plugs.WebhookAuth.call/2","doc":"iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])\n %Plug.Conn{status: 200, ...}\n\n iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])\n %Plug.Conn{status: 404, ...}","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-webhook-found-and-authenticated"},{"type":"function","title":"LightningWeb.Plugs.WebhookAuth.init/1","doc":"Initializes the options.","ref":"LightningWeb.Plugs.WebhookAuth.html#init/1"},{"type":"module","title":"LightningWeb.ProfileLive.Edit","doc":"LiveView for user profile page.","ref":"LightningWeb.ProfileLive.Edit.html"},{"type":"function","title":"LightningWeb.ProfileLive.Edit.render/1","doc":"","ref":"LightningWeb.ProfileLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.FormComponent","doc":"Form component update profile email and password","ref":"LightningWeb.ProfileLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.FormComponent.enum_options/2","doc":"","ref":"LightningWeb.ProfileLive.FormComponent.html#enum_options/2"},{"type":"function","title":"LightningWeb.ProfileLive.FormComponent.render/1","doc":"","ref":"LightningWeb.ProfileLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.MfaComponent","doc":"Component to enable MFA on a User's account","ref":"LightningWeb.ProfileLive.MfaComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.MfaComponent.render/1","doc":"","ref":"LightningWeb.ProfileLive.MfaComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectFileController","doc":"","ref":"LightningWeb.ProjectFileController.html"},{"type":"function","title":"LightningWeb.ProjectFileController.download/2","doc":"","ref":"LightningWeb.ProjectFileController.html#download/2"},{"type":"module","title":"LightningWeb.ProjectLive.Collaborators","doc":"This schema is used for building the changeset for adding new collaborators to a project.\nIt is mirroring the `Project -> ProjectUser` relationship.","ref":"LightningWeb.ProjectLive.Collaborators.html"},{"type":"function","title":"LightningWeb.ProjectLive.Collaborators.changeset/2","doc":"","ref":"LightningWeb.ProjectLive.Collaborators.html#changeset/2"},{"type":"function","title":"LightningWeb.ProjectLive.Collaborators.prepare_for_insertion/3","doc":"","ref":"LightningWeb.ProjectLive.Collaborators.html#prepare_for_insertion/3"},{"type":"module","title":"LightningWeb.ProjectLive.Collaborators.Collaborator","doc":"","ref":"LightningWeb.ProjectLive.Collaborators.Collaborator.html"},{"type":"module","title":"LightningWeb.ProjectLive.FormComponent","doc":"Form Component for working with a single Job\n\nA Job's `adaptor` field is a combination of the module name and the version.\nIt's formatted as an NPM style string.\n\nThe form allows the user to select a module by name and then it's version,\nwhile the version dropdown itself references `adaptor` directly.\n\nMeaning the `adaptor_name` dropdown and assigns value is not persisted.","ref":"LightningWeb.ProjectLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProjectLive.FormComponent.render/1","doc":"","ref":"LightningWeb.ProjectLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.ProjectLive.Index.html"},{"type":"function","title":"LightningWeb.ProjectLive.Index.delete_action/1","doc":"","ref":"LightningWeb.ProjectLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.ProjectLive.Index.render/1","doc":"","ref":"LightningWeb.ProjectLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.InvitedCollaborators","doc":"This schema is used for building the changeset for adding new collaborators to a project.\nIt is mirroring the `Project -> ProjectUser` relationship.","ref":"LightningWeb.ProjectLive.InvitedCollaborators.html"},{"type":"function","title":"LightningWeb.ProjectLive.InvitedCollaborators.changeset/2","doc":"","ref":"LightningWeb.ProjectLive.InvitedCollaborators.html#changeset/2"},{"type":"function","title":"LightningWeb.ProjectLive.InvitedCollaborators.validate_collaborators/2","doc":"","ref":"LightningWeb.ProjectLive.InvitedCollaborators.html#validate_collaborators/2"},{"type":"module","title":"LightningWeb.ProjectLive.InvitedCollaborators.InvitedCollaborator","doc":"","ref":"LightningWeb.ProjectLive.InvitedCollaborators.InvitedCollaborator.html"},{"type":"module","title":"LightningWeb.ProjectLive.MFARequired","doc":"Liveview for project access denied error messages","ref":"LightningWeb.ProjectLive.MFARequired.html"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.on_mount/4","doc":"","ref":"LightningWeb.ProjectLive.MFARequired.html#on_mount/4"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.render/1","doc":"","ref":"LightningWeb.ProjectLive.MFARequired.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Settings","doc":"Index Liveview for project settings","ref":"LightningWeb.ProjectLive.Settings.html"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.digest/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#digest/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.permissions_message/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#permissions_message/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.render/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#render/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.role/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#role/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.user/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#user/1"},{"type":"module","title":"LightningWeb.PromExPlugAuthorization","doc":"Implement custom authorization for PromEx metrics endpoint as per\nhttps://hexdocs.pm/prom_ex/1.1.1/PromEx.Plug.html","ref":"LightningWeb.PromExPlugAuthorization.html"},{"type":"module","title":"LightningWeb.ReAuthenticateLive.New","doc":"LiveView for re-authentication page.","ref":"LightningWeb.ReAuthenticateLive.New.html"},{"type":"function","title":"LightningWeb.ReAuthenticateLive.New.render/1","doc":"","ref":"LightningWeb.ReAuthenticateLive.New.html#render/1"},{"type":"module","title":"LightningWeb.RouteHelpers","doc":"Convenience functions for generating paths.","ref":"LightningWeb.RouteHelpers.html"},{"type":"function","title":"LightningWeb.RouteHelpers.oidc_callback_url/0","doc":"","ref":"LightningWeb.RouteHelpers.html#oidc_callback_url/0"},{"type":"function","title":"LightningWeb.RouteHelpers.project_dashboard_url/1","doc":"","ref":"LightningWeb.RouteHelpers.html#project_dashboard_url/1"},{"type":"function","title":"LightningWeb.RouteHelpers.show_run_url/2","doc":"","ref":"LightningWeb.RouteHelpers.html#show_run_url/2"},{"type":"module","title":"LightningWeb.Router","doc":"The router for Lightning.","ref":"LightningWeb.Router.html"},{"type":"function","title":"LightningWeb.Router.api/2","doc":"","ref":"LightningWeb.Router.html#api/2"},{"type":"function","title":"LightningWeb.Router.browser/2","doc":"","ref":"LightningWeb.Router.html#browser/2"},{"type":"function","title":"LightningWeb.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"LightningWeb.Router.html#call/2"},{"type":"function","title":"LightningWeb.Router.init/1","doc":"Callback required by Plug that initializes the router\nfor serving web requests.","ref":"LightningWeb.Router.html#init/1"},{"type":"function","title":"LightningWeb.Router.storybook_assets/2","doc":"","ref":"LightningWeb.Router.html#storybook_assets/2"},{"type":"function","title":"LightningWeb.Router.storybook_browser/2","doc":"","ref":"LightningWeb.Router.html#storybook_browser/2"},{"type":"module","title":"LightningWeb.RunChannel","doc":"Phoenix channel to interact with Runs.","ref":"LightningWeb.RunChannel.html"},{"type":"function","title":"LightningWeb.RunChannel.child_spec/1","doc":"","ref":"LightningWeb.RunChannel.html#child_spec/1"},{"type":"function","title":"LightningWeb.RunChannel.handle_in/3","doc":"For the time being, calls to `fetch:dataclip` will return dataclips that are\npreformatted for use as \"initial state\" in a run.\n\nThis means that the body of http requests will be nested inside a \"data\" key.\n\nThere is an open discussion on the community that may impact how we\nstore HTTP requests in the database as dataclips and how we send the body\nof those HTTP requests to the worker to use as initial state.","ref":"LightningWeb.RunChannel.html#handle_in/3"},{"type":"function","title":"LightningWeb.RunChannel.start_link/1","doc":"","ref":"LightningWeb.RunChannel.html#start_link/1"},{"type":"module","title":"LightningWeb.RunLive.ExportConfirmationModal","doc":"","ref":"LightningWeb.RunLive.ExportConfirmationModal.html"},{"type":"module","title":"LightningWeb.RunLive.Index","doc":"Index Liveview for Runs","ref":"LightningWeb.RunLive.Index.html"},{"type":"function","title":"LightningWeb.RunLive.Index.checked?/2","doc":"Takes a changeset used for querying workorders and checks to see if the given\nfilter is present in that changeset. Returns true or false.","ref":"LightningWeb.RunLive.Index.html#checked?/2"},{"type":"function","title":"LightningWeb.RunLive.Index.filters_changeset/1","doc":"Creates a changeset based on given parameters and the fixed workorder filter types.","ref":"LightningWeb.RunLive.Index.html#filters_changeset/1"},{"type":"function","title":"LightningWeb.RunLive.Index.handle_info/2","doc":"When a WorkOrderCreated event is detected, we first check to see if the new\nwork order is admissible on the page, given the current filters. If it is, we\nadd it to the top of the page. If not, nothing happens.","ref":"LightningWeb.RunLive.Index.html#handle_info/2"},{"type":"function","title":"LightningWeb.RunLive.Index.render/1","doc":"","ref":"LightningWeb.RunLive.Index.html#render/1"},{"type":"function","title":"LightningWeb.RunLive.Index.validate_bulk_rerun/2","doc":"","ref":"LightningWeb.RunLive.Index.html#validate_bulk_rerun/2"},{"type":"module","title":"LightningWeb.RunLive.RerunJobComponent","doc":"Rerun job component","ref":"LightningWeb.RunLive.RerunJobComponent.html"},{"type":"module","title":"LightningWeb.RunLive.RunViewerLive","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html"},{"type":"function","title":"LightningWeb.RunLive.RunViewerLive.apply_selected_step_id/2","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html#apply_selected_step_id/2"},{"type":"function","title":"LightningWeb.RunLive.RunViewerLive.handle_steps_change/1","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html#handle_steps_change/1"},{"type":"module","title":"LightningWeb.RunLive.Show","doc":"","ref":"LightningWeb.RunLive.Show.html"},{"type":"function","title":"LightningWeb.RunLive.Show.apply_selected_step_id/2","doc":"","ref":"LightningWeb.RunLive.Show.html#apply_selected_step_id/2"},{"type":"function","title":"LightningWeb.RunLive.Show.handle_steps_change/1","doc":"","ref":"LightningWeb.RunLive.Show.html#handle_steps_change/1"},{"type":"module","title":"LightningWeb.RunLive.Streaming","doc":"","ref":"LightningWeb.RunLive.Streaming.html"},{"type":"function","title":"LightningWeb.RunLive.Streaming.add_or_update_step/2","doc":"","ref":"LightningWeb.RunLive.Streaming.html#add_or_update_step/2"},{"type":"function","title":"LightningWeb.RunLive.Streaming.get_dataclip/2","doc":"","ref":"LightningWeb.RunLive.Streaming.html#get_dataclip/2"},{"type":"function","title":"LightningWeb.RunLive.Streaming.get_run_async/2","doc":"Starts an async process that will fetch the run with the given ID.","ref":"LightningWeb.RunLive.Streaming.html#get_run_async/2"},{"type":"function","title":"LightningWeb.RunLive.Streaming.maybe_load_input_dataclip/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#maybe_load_input_dataclip/1"},{"type":"function","title":"LightningWeb.RunLive.Streaming.maybe_load_output_dataclip/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#maybe_load_output_dataclip/1"},{"type":"function","title":"LightningWeb.RunLive.Streaming.sort_steps/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#sort_steps/1"},{"type":"function","title":"LightningWeb.RunLive.Streaming.unselect_step/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#unselect_step/1"},{"type":"module","title":"LightningWeb.RunLive.WorkOrderComponent","doc":"Work Order component","ref":"LightningWeb.RunLive.WorkOrderComponent.html"},{"type":"function","title":"LightningWeb.RunLive.WorkOrderComponent.render/1","doc":"","ref":"LightningWeb.RunLive.WorkOrderComponent.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.RunLive.WorkOrderComponent.render/1","doc":"* `show_details` (`:boolean`) - Defaults to `false`.\n* `show_prev_runs` (`:boolean`) - Defaults to `false`.\n* `entry_selected` (`:boolean`) - Defaults to `false`.","ref":"LightningWeb.RunLive.WorkOrderComponent.html#render/1-attributes"},{"type":"module","title":"LightningWeb.Telemetry","doc":"Assorted metrics to collect during runtime.\n\nSee https://hexdocs.pm/phoenix/telemetry.html","ref":"LightningWeb.Telemetry.html"},{"type":"function","title":"LightningWeb.Telemetry.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"LightningWeb.Telemetry.html#child_spec/1"},{"type":"function","title":"LightningWeb.Telemetry.metrics/0","doc":"","ref":"LightningWeb.Telemetry.html#metrics/0"},{"type":"function","title":"LightningWeb.Telemetry.start_link/1","doc":"","ref":"LightningWeb.Telemetry.html#start_link/1"},{"type":"function","title":"LightningWeb.Telemetry.with_span/3","doc":"Convenience function that wraps `:telemetry.span/3`.\n\nGiven a function with an arity of zero, it passes the `metadata` argument\nout with the result of the function.\n\nIf you need to control the `metadata`, pass in a function with an arity of\none. It will be called with the metadata provided and expects the result and\nthe updated metadata to be returned in a tuple.\n\nExample:\n\n with_span([:my, span], %{project_id: 123}, fn -> get_project(456) end)\n\nOr when you want to extend the metadata:\n\n with_span([:my, :span], %{user_id: 123}, fn _metadata ->\n project = get_project(456)\n {project, %{project_id: project.id}}\n end)","ref":"LightningWeb.Telemetry.html#with_span/3"},{"type":"module","title":"LightningWeb.TokensLive.Index","doc":"LiveView for listing and managing tokens","ref":"LightningWeb.TokensLive.Index.html"},{"type":"function","title":"LightningWeb.TokensLive.Index.render/1","doc":"","ref":"LightningWeb.TokensLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserAuth","doc":"The UserAuth controller.","ref":"LightningWeb.UserAuth.html"},{"type":"function","title":"LightningWeb.UserAuth.authenticate_bearer/2","doc":"","ref":"LightningWeb.UserAuth.html#authenticate_bearer/2"},{"type":"function","title":"LightningWeb.UserAuth.fetch_current_user/2","doc":"Authenticates the user by looking into the session\nand remember me token.","ref":"LightningWeb.UserAuth.html#fetch_current_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_in_user/2","doc":"Logs the user in by creating a new session token.","ref":"LightningWeb.UserAuth.html#log_in_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_out_user/1","doc":"Logs the user out.\n\nIt clears all session data for safety. See renew_session.","ref":"LightningWeb.UserAuth.html#log_out_user/1"},{"type":"function","title":"LightningWeb.UserAuth.mark_totp_pending/1","doc":"","ref":"LightningWeb.UserAuth.html#mark_totp_pending/1"},{"type":"function","title":"LightningWeb.UserAuth.new_session/2","doc":"Assigns the token to a new session.\n\nIt renews the session ID and clears the whole session\nto avoid fixation attacks. See the renew_session\nfunction to customize this behaviour.\n\nIt also sets a `:live_socket_id` key in the session,\nso LiveView sessions are identified and automatically\ndisconnected on log out. The line can be safely removed\nif you are not using LiveView.","ref":"LightningWeb.UserAuth.html#new_session/2"},{"type":"function","title":"LightningWeb.UserAuth.on_mount/4","doc":"Used for LiveView routes that require the user to be reauthenticated.","ref":"LightningWeb.UserAuth.html#on_mount/4"},{"type":"function","title":"LightningWeb.UserAuth.reauth_sudo_mode/2","doc":"Reauthenticate the user by using the sudo token","ref":"LightningWeb.UserAuth.html#reauth_sudo_mode/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_if_user_is_authenticated/2","doc":"Used for routes that require the user to not be authenticated.","ref":"LightningWeb.UserAuth.html#redirect_if_user_is_authenticated/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_with_return_to/2","doc":"Returns to or redirects to the dashboard and potentially set remember_me token.","ref":"LightningWeb.UserAuth.html#redirect_with_return_to/2"},{"type":"function","title":"LightningWeb.UserAuth.require_authenticated_api_resource/2","doc":"Used for API routes that require the resource to be authenticated.\nA resource can be a `User` or a `ProjectRepoConnection`","ref":"LightningWeb.UserAuth.html#require_authenticated_api_resource/2"},{"type":"function","title":"LightningWeb.UserAuth.require_authenticated_user/2","doc":"Used for routes that require the user to be authenticated.\n\nIf you want to enforce the user email is confirmed before\nthey use the application at all, here would be a good place.","ref":"LightningWeb.UserAuth.html#require_authenticated_user/2"},{"type":"function","title":"LightningWeb.UserAuth.require_sudo_user/2","doc":"Used for routes that require the user to be reauthenticated.","ref":"LightningWeb.UserAuth.html#require_sudo_user/2"},{"type":"function","title":"LightningWeb.UserAuth.require_superuser/2","doc":"Require that the user has the `superuser` role","ref":"LightningWeb.UserAuth.html#require_superuser/2"},{"type":"function","title":"LightningWeb.UserAuth.totp_pending?/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_pending?/1"},{"type":"function","title":"LightningWeb.UserAuth.totp_validated/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_validated/1"},{"type":"module","title":"LightningWeb.UserConfirmationController","doc":"","ref":"LightningWeb.UserConfirmationController.html"},{"type":"function","title":"LightningWeb.UserConfirmationController.confirm_email/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#confirm_email/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.create/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#create/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.edit/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#edit/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.new/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#new/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.send_email/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#send_email/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.update/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#update/2"},{"type":"module","title":"LightningWeb.UserLive.Edit","doc":"LiveView for editing a single job, which inturn uses `LightningWeb.JobLive.BigFormComponent`\nfor common functionality.","ref":"LightningWeb.UserLive.Edit.html"},{"type":"function","title":"LightningWeb.UserLive.Edit.render/1","doc":"","ref":"LightningWeb.UserLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.FormComponent","doc":"Form component for creating and editing users","ref":"LightningWeb.UserLive.FormComponent.html"},{"type":"function","title":"LightningWeb.UserLive.FormComponent.render/1","doc":"","ref":"LightningWeb.UserLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.Index","doc":"Index page for listing users","ref":"LightningWeb.UserLive.Index.html"},{"type":"function","title":"LightningWeb.UserLive.Index.delete_action/1","doc":"","ref":"LightningWeb.UserLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.UserLive.Index.render/1","doc":"","ref":"LightningWeb.UserLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserRegistrationController","doc":"","ref":"LightningWeb.UserRegistrationController.html"},{"type":"function","title":"LightningWeb.UserRegistrationController.create/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#create/2"},{"type":"function","title":"LightningWeb.UserRegistrationController.new/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#new/2"},{"type":"module","title":"LightningWeb.UserResetPasswordController","doc":"","ref":"LightningWeb.UserResetPasswordController.html"},{"type":"function","title":"LightningWeb.UserResetPasswordController.create/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#create/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.edit/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#edit/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.new/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#new/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.update/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#update/2"},{"type":"module","title":"LightningWeb.UserSessionController","doc":"","ref":"LightningWeb.UserSessionController.html"},{"type":"function","title":"LightningWeb.UserSessionController.auth_handler_url/0","doc":"","ref":"LightningWeb.UserSessionController.html#auth_handler_url/0"},{"type":"function","title":"LightningWeb.UserSessionController.create/2","doc":"","ref":"LightningWeb.UserSessionController.html#create/2"},{"type":"function","title":"LightningWeb.UserSessionController.delete/2","doc":"","ref":"LightningWeb.UserSessionController.html#delete/2"},{"type":"function","title":"LightningWeb.UserSessionController.exchange_token/2","doc":"","ref":"LightningWeb.UserSessionController.html#exchange_token/2"},{"type":"function","title":"LightningWeb.UserSessionController.new/2","doc":"","ref":"LightningWeb.UserSessionController.html#new/2"},{"type":"module","title":"LightningWeb.UserTOTPController","doc":"","ref":"LightningWeb.UserTOTPController.html"},{"type":"function","title":"LightningWeb.UserTOTPController.create/2","doc":"","ref":"LightningWeb.UserTOTPController.html#create/2"},{"type":"function","title":"LightningWeb.UserTOTPController.new/2","doc":"","ref":"LightningWeb.UserTOTPController.html#new/2"},{"type":"module","title":"LightningWeb.Utils","doc":"Helper functions to deal with forms and query params.","ref":"LightningWeb.Utils.html"},{"type":"function","title":"LightningWeb.Utils.build_params_for_field/3","doc":"","ref":"LightningWeb.Utils.html#build_params_for_field/3"},{"type":"function","title":"LightningWeb.Utils.decode_one/2","doc":"","ref":"LightningWeb.Utils.html#decode_one/2"},{"type":"module","title":"LightningWeb.VersionControlController","doc":"","ref":"LightningWeb.VersionControlController.html"},{"type":"function","title":"LightningWeb.VersionControlController.index/2","doc":"","ref":"LightningWeb.VersionControlController.html#index/2"},{"type":"module","title":"LightningWeb.WebhooksController","doc":"","ref":"LightningWeb.WebhooksController.html"},{"type":"function","title":"LightningWeb.WebhooksController.check/2","doc":"","ref":"LightningWeb.WebhooksController.html#check/2"},{"type":"function","title":"LightningWeb.WebhooksController.create/2","doc":"","ref":"LightningWeb.WebhooksController.html#create/2"},{"type":"module","title":"LightningWeb.WorkerChannel","doc":"Websocket channel to handle when workers join or claim something to run.","ref":"LightningWeb.WorkerChannel.html"},{"type":"function","title":"LightningWeb.WorkerChannel.child_spec/1","doc":"","ref":"LightningWeb.WorkerChannel.html#child_spec/1"},{"type":"function","title":"LightningWeb.WorkerChannel.start_link/1","doc":"","ref":"LightningWeb.WorkerChannel.html#start_link/1"},{"type":"module","title":"LightningWeb.WorkerSocket","doc":"","ref":"LightningWeb.WorkerSocket.html"},{"type":"function","title":"LightningWeb.WorkerSocket.handle_error/2","doc":"","ref":"LightningWeb.WorkerSocket.html#handle_error/2"},{"type":"module","title":"LightningWeb.WorkflowLive.AiAssistantComponent","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.handle_async/3","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#handle_async/3"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.handle_event/3","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#handle_event/3"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.mount/1","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#mount/1"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.render/1","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#render/1"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.update/2","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#update/2"},{"type":"module","title":"LightningWeb.WorkflowLive.EditorPane","doc":"","ref":"LightningWeb.WorkflowLive.EditorPane.html"},{"type":"function","title":"LightningWeb.WorkflowLive.EditorPane.render/1","doc":"","ref":"LightningWeb.WorkflowLive.EditorPane.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.WorkflowLive.EditorPane.render/1","doc":"* `id` (`:string`) (required)\n* `disabled` (`:boolean`) - Defaults to `false`.\n* `disabled_message` (`:string`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.\n* `on_change` (`:any`) (required)\n* `adaptor` (`:string`) (required)\n* `source` (`:string`) (required)\n* `job_id` (`:string`) (required)","ref":"LightningWeb.WorkflowLive.EditorPane.html#render/1-attributes"},{"type":"module","title":"LightningWeb.WorkflowLive.Helpers","doc":"Helper functions for the Workflow LiveViews.","ref":"LightningWeb.WorkflowLive.Helpers.html"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.broadcast_updated_params/2","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#broadcast_updated_params/2"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.run_workflow/3","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#run_workflow/3"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.save_workflow/1","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#save_workflow/1"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.subscribe_to_params_update/1","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#subscribe_to_params_update/1"},{"type":"module","title":"LightningWeb.WorkflowLive.JobView","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.container/1","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html#container/1"},{"type":"function","title":"Attributes - LightningWeb.WorkflowLive.JobView.container/1","doc":"* `id` (`:string`) (required)","ref":"LightningWeb.WorkflowLive.JobView.html#container/1-attributes"},{"type":"function","title":"Slots - LightningWeb.WorkflowLive.JobView.container/1","doc":"* `top`\n* `inner_block`\n* `bottom`\n* `column` - Accepts attributes:\n\n * `class` (`:string`) - Extra CSS classes for the column.","ref":"LightningWeb.WorkflowLive.JobView.html#container/1-slots"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1"},{"type":"function","title":"Attributes - LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"* `job` (`:map`) (required)\n* `form` (`:map`) (required) - A form built from a job.\n* `current_user` (`:map`) (required)\n* `project` (`:map`) (required)\n* `close_url` (`:any`) (required)\n* `socket` (`:any`) (required)\n* `follow_run_id` (`:any`) - Defaults to `nil`.\n* `snapshot` (`:any`) (required)\n* `snapshot_version` (`:any`) (required)\n* `display_banner` (`:boolean`) - Defaults to `false`.\n* `banner_message` (`:string`) - Defaults to `\"\"`.\n* `presences` (`:list`) (required)\n* `prior_user_presence` (`:any`) (required)","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1-attributes"},{"type":"function","title":"Slots - LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"* `footer`\n* `collapsible_panel` - Accepts attributes:\n\n * `id` (`:string`) (required)\n * `panel_title` (`:string`) (required)\n * `class` (`:string`) - Extra CSS classes for the column.","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1-slots"},{"type":"module","title":"LightningWeb.WorkflowLive.NewWorkflowForm","doc":"","ref":"LightningWeb.WorkflowLive.NewWorkflowForm.html"},{"type":"function","title":"LightningWeb.WorkflowLive.NewWorkflowForm.validate/2","doc":"","ref":"LightningWeb.WorkflowLive.NewWorkflowForm.html#validate/2"},{"type":"function","title":"LightningWeb.WorkflowLive.NewWorkflowForm.validate_for_save/1","doc":"","ref":"LightningWeb.WorkflowLive.NewWorkflowForm.html#validate_for_save/1"},{"type":"module","title":"LightningWeb.WorkflowNewLive.WorkflowParams","doc":"Various function for reconciling changes to a workflow params map.\n\nThe front end editor uses JSON patches to represent changes to the workflow.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_form_params/2","doc":"Produce a new set of params by applying the given form params to the current\nparams.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_form_params/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_patches/2","doc":"Produce a new set of params by applying the given patches to the current parms","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_patches/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_map/1","doc":"Convert a changeset to a serializable map of workflow params, suitable for\nsending to the front end editor.\n\nIt uses `Lightning.Helpers.json_safe/1` to ensure that the map is safe to\nserialize to JSON. This is necessary because the underlying model may\ncontain atom values.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_map/1"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_patches/2","doc":"Produce a set of patches that represent the difference between the initial\nparams and the target params.\n\nThis usually is used to produce a set of patches that represent the changes\nintroduced by a changeset.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_patches/2"},{"type":"module","title":"Lightning.API","doc":"Behaviour for implementing the Lightning interface.\n\nThis behaviour is used to mock specific functions in tests.","ref":"Lightning.API.html"},{"type":"module","title":"Lightning.AdaptorRegistry","doc":"Registry process to query and maintain a list of adaptors available for\nwriting jobs.\n\nCurrently it queries NPM for all modules in the `@openfn` organization and\nfilters out modules that are known not to be adaptors.\n\n**Usage**\n\n```\n# Starting the process\nAdaptorRegistry.start_link()\n# Getting a list of all adaptors\nLightning.AdaptorRegistry.AdaptorRegistry.all()\n```\n\n**Caching**\n\nBy default the results are cached to disk, and will be reused every start.\n\nIn order to disable or configure caching pass see: `start_link/1`.\n\nThe process uses `:continue` to return before the adaptors have been queried.\nThis does mean that the first call to the process will be delayed until\nthe `handle_continue/2` has finished.\n\n**Timeouts**\n\nThere is a 'general' timeout of 30s, this is used for GenServer calls like\n`all/1` and also internally when the modules are being queried. NPM can\nbe extremely fast to respond if the package is cached on their side, but\ncan take a couple of seconds if not cached.","ref":"Lightning.AdaptorRegistry.html"},{"type":"function","title":"Lightning.AdaptorRegistry.all/1","doc":"Get the current in-process list of adaptors.\nThis call will wait behind the `:continue` message when the process starts\nup, so it may take a while the first time it is called (and the list hasn't\nbeen fetched yet).","ref":"Lightning.AdaptorRegistry.html#all/1"},{"type":"function","title":"Lightning.AdaptorRegistry.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.AdaptorRegistry.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorRegistry.fetch/0","doc":"Fetch a list of packages for the @openfn organisation","ref":"Lightning.AdaptorRegistry.html#fetch/0"},{"type":"function","title":"Lightning.AdaptorRegistry.latest_for/2","doc":"Get a latest version for a given module.","ref":"Lightning.AdaptorRegistry.html#latest_for/2"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_adaptor/1","doc":"","ref":"Lightning.AdaptorRegistry.html#resolve_adaptor/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name/1","doc":"Destructures an NPM style package name into module name and version.\n\n**Example**\n\n iex> resolve_package_name(\"@openfn/language-salesforce@1.2.3\")\n { \"@openfn/language-salesforce\", \"1.2.3\" }\n iex> resolve_package_name(\"@openfn/language-salesforce\")\n { \"@openfn/language-salesforce\", nil }","ref":"Lightning.AdaptorRegistry.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name!/1","doc":"Same as `resolve_package_name/1` except will throw an exception if a package\nname cannot be matched.","ref":"Lightning.AdaptorRegistry.html#resolve_package_name!/1"},{"type":"function","title":"Lightning.AdaptorRegistry.start_link/1","doc":"Starts the AdaptorRegistry\n\n**Options**\n\n- `:use_cache` (defaults to false) - stores the last set of results on disk\n and uses the cached file for every subsequent start.\n It can either be a boolean, or a string - the latter being a file path\n to set where the cache file is located.\n- `:name` (defaults to AdaptorRegistry) - the name of the process, useful\n for testing and/or running multiple versions of the registry","ref":"Lightning.AdaptorRegistry.html#start_link/1"},{"type":"function","title":"Lightning.AdaptorRegistry.versions_for/2","doc":"Get a list of versions for a given module.","ref":"Lightning.AdaptorRegistry.html#versions_for/2"},{"type":"module","title":"Lightning.AdaptorRegistry.Npm","doc":"NPM API functions","ref":"Lightning.AdaptorRegistry.Npm.html"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete/3","doc":"Issues a DELETE request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get/3","doc":"Issues a GET request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head/3","doc":"Issues a HEAD request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options/3","doc":"Issues an OPTIONS request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.package_detail/1","doc":"Retrieve all details for an NPM package","ref":"Lightning.AdaptorRegistry.Npm.html#package_detail/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch/4","doc":"Issues a PATCH request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post/4","doc":"Issues a POST request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_headers/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_body/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_body/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_headers/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_options/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_options/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_params/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_params/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_chunk/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_headers/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_status_code/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_status_code/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_url/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_url/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put/4","doc":"Issues a PUT request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/1","doc":"Issues an HTTP request using an `HTTPoison.Request` struct.\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AdaptorRegistry.Npm.html#request/1"},{"type":"function","title":"Redirect handling - Lightning.AdaptorRegistry.Npm.request/1","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AdaptorRegistry.Npm.html#request/1-redirect-handling"},{"type":"function","title":"Examples - Lightning.AdaptorRegistry.Npm.request/1","doc":"request = %HTTPoison.Request{\n method: :post,\n url: \"https://my.website.com\",\n body: \"{\\\"foo\\\": 3}\",\n headers: [{\"Accept\", \"application/json\"}]\n }\n\n request(request)","ref":"Lightning.AdaptorRegistry.Npm.html#request/1-examples"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/5","doc":"Issues an HTTP request with the given method to the given url.\n\nThis function is usually used indirectly by `get/3`, `post/4`, `put/4`, etc\n\nArgs:\n * `method` - HTTP method as an atom (`:get`, `:head`, `:post`, `:put`,\n `:delete`, etc.)\n * `url` - target url as a binary string or char list\n * `body` - request body. See more below\n * `headers` - HTTP headers as an orddict (e.g., `[{\"Accept\", \"application/json\"}]`)\n * `options` - Keyword list of options\n\nBody: see type `HTTPoison.Request`\n\nOptions: see type `HTTPoison.Request`\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AdaptorRegistry.Npm.html#request/5"},{"type":"function","title":"Redirect handling - Lightning.AdaptorRegistry.Npm.request/5","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AdaptorRegistry.Npm.html#request/5-redirect-handling"},{"type":"function","title":"Examples - Lightning.AdaptorRegistry.Npm.request/5","doc":"request(:post, \"https://my.website.com\", \"{\\\"foo\\\": 3}\", [{\"Accept\", \"application/json\"}])","ref":"Lightning.AdaptorRegistry.Npm.html#request/5-examples"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request!/1","doc":"Issues an HTTP request an `HTTPoison.Request` struct.\nexception in case of failure.\n\n`request!/1` works exactly like `request/1` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AdaptorRegistry.Npm.html#request!/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an\nexception in case of failure.\n\n`request!/5` works exactly like `request/5` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AdaptorRegistry.Npm.html#request!/5"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AdaptorRegistry.Npm.html#start/0"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.stream_next/1","doc":"Requests the next message to be streamed for a given `HTTPoison.AsyncResponse`.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#stream_next/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.user_packages/1","doc":"Retrieve all packages for a given user or organization. Return empty list if\napplication cannot connect to NPM. (E.g., because it's started offline.)","ref":"Lightning.AdaptorRegistry.Npm.html#user_packages/1"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.body/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:body/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.headers/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:headers/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.method/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:method/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.options/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:options/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.params/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:params/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.request/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:request/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.url/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:url/0"},{"type":"module","title":"Lightning.AdaptorService","doc":"The Adaptor Service is use to query and install adaptors in order to run jobs.\n\nOn startup, it queries the filesystem for `package.json` files and builds up\na list of available adaptors.","ref":"Lightning.AdaptorService.html"},{"type":"module","title":"Configuration - Lightning.AdaptorService","doc":"The service requires at least `:adaptors_path`, which is used to both query\nwhich adaptors are installed and when to install new adaptors.\n\nAnother optional setting is: `:repo`, which must point at a module that will be\nused to do the querying and installing.","ref":"Lightning.AdaptorService.html#module-configuration"},{"type":"module","title":"Installing Adaptors - Lightning.AdaptorService","doc":"Using the `install/2` function an adaptor can be installed, which will also\nadd it to the list of available adaptors.\n\nThe adaptor is marked as `:installing`, to allow for conditional behaviour\nelsewhere such as delaying or rejecting processing until the adaptor becomes\navailable.","ref":"Lightning.AdaptorService.html#module-installing-adaptors"},{"type":"module","title":"Looking up adaptors - Lightning.AdaptorService","doc":"The module leans on Elixir's built-in `Version` module to provide version\nlookups.\n\nWhen looking up an adaptor, either a string or a tuple can be used.\nIn the case of requesting the latest version, any one of these will return\nthe latest version the service is aware of.\n\n- `@openfn/language-http`\n- `@openfn/language-http@latest`\n- `{\"@openfn/language-http\", nil}`\n- `{\"@openfn/language-http\", \"latest\"}`\n- `{~r/language-http/, \"latest\"}`\n\nYou can also request a specific version, or use a range specification:\n\n- `@openfn/language-http@1.2.3`\n- `{\"@openfn/language-http\", \"~> 1.2.0\"}`\n- `{\"@openfn/language-http\", \" **NOTE**\n> More complex npm style install strings like: `\">=0.1.0 are not supported.\n> Generally the tuple style is preferred when using range specifications as\n> the npm style strings have a simplistic regex splitter.\n\nSee [Version](https://hexdocs.pm/elixir/Version.html) for more details on\nmatching versions.","ref":"Lightning.AdaptorService.html#module-looking-up-adaptors"},{"type":"function","title":"Lightning.AdaptorService.build_aliased_name/1","doc":"Turns a package name and version into a string for NPM.\n\nSince multiple versions of the same package can be installed, it's important\nto rely on npms built-in package aliasing.\n\nE.g. `@openfn/language-http@1.2.8` turns into:\n `@openfn/language-http-1.2.8@npm:@openfn/language-http@1.2.8`\n\nWhich is pretty long winded but necessary for the reason above.\n\nIf using this module as a base, it's likely you would need to adaptor this\nto suit your particular naming strategy.","ref":"Lightning.AdaptorService.html#build_aliased_name/1"},{"type":"function","title":"Lightning.AdaptorService.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.AdaptorService.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorService.find_adaptor/2","doc":"","ref":"Lightning.AdaptorService.html#find_adaptor/2"},{"type":"function","title":"Lightning.AdaptorService.get_adaptors/1","doc":"","ref":"Lightning.AdaptorService.html#get_adaptors/1"},{"type":"function","title":"Lightning.AdaptorService.install/2","doc":"","ref":"Lightning.AdaptorService.html#install/2"},{"type":"function","title":"Lightning.AdaptorService.install!/2","doc":"","ref":"Lightning.AdaptorService.html#install!/2"},{"type":"function","title":"Lightning.AdaptorService.installed?/2","doc":"","ref":"Lightning.AdaptorService.html#installed?/2"},{"type":"function","title":"Lightning.AdaptorService.resolve_package_name/1","doc":"","ref":"Lightning.AdaptorService.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorService.start_link/1","doc":"","ref":"Lightning.AdaptorService.html#start_link/1"},{"type":"type","title":"Lightning.AdaptorService.package_spec/0","doc":"","ref":"Lightning.AdaptorService.html#t:package_spec/0"},{"type":"module","title":"Lightning.AiAssistant","doc":"The AI assistant module.","ref":"Lightning.AiAssistant.html"},{"type":"function","title":"Lightning.AiAssistant.available?/1","doc":"","ref":"Lightning.AiAssistant.html#available?/1"},{"type":"function","title":"Lightning.AiAssistant.create_session/3","doc":"","ref":"Lightning.AiAssistant.html#create_session/3"},{"type":"function","title":"Lightning.AiAssistant.enabled?/0","doc":"Checks if the AI assistant is enabled.","ref":"Lightning.AiAssistant.html#enabled?/0"},{"type":"function","title":"Lightning.AiAssistant.endpoint_available?/0","doc":"Checks if the Apollo endpoint is available.","ref":"Lightning.AiAssistant.html#endpoint_available?/0"},{"type":"function","title":"Lightning.AiAssistant.get_session!/1","doc":"","ref":"Lightning.AiAssistant.html#get_session!/1"},{"type":"function","title":"Lightning.AiAssistant.list_sessions_for_job/1","doc":"","ref":"Lightning.AiAssistant.html#list_sessions_for_job/1"},{"type":"function","title":"Lightning.AiAssistant.project_has_any_session?/1","doc":"","ref":"Lightning.AiAssistant.html#project_has_any_session?/1"},{"type":"function","title":"Lightning.AiAssistant.put_expression_and_adaptor/3","doc":"","ref":"Lightning.AiAssistant.html#put_expression_and_adaptor/3"},{"type":"function","title":"Lightning.AiAssistant.query/2","doc":"Queries the AI assistant with the given content.\n\nReturns `{:ok, session}` if the query was successful, otherwise `:error`.\n\n**Example**\n\n iex> AiAssistant.query(session, \"fn()\")\n {:ok, session}","ref":"Lightning.AiAssistant.html#query/2"},{"type":"function","title":"Lightning.AiAssistant.save_message/2","doc":"","ref":"Lightning.AiAssistant.html#save_message/2"},{"type":"module","title":"Lightning.AiAssistant.Limiter","doc":"The AI assistant limiter to check for AI query quota.","ref":"Lightning.AiAssistant.Limiter.html"},{"type":"function","title":"Lightning.AiAssistant.Limiter.validate_quota/1","doc":"Checks if has not reached the limit of the project ai queries quota.","ref":"Lightning.AiAssistant.Limiter.html#validate_quota/1"},{"type":"module","title":"Lightning.ApolloClient","doc":"Client for communicating with the Apollo service.","ref":"Lightning.ApolloClient.html"},{"type":"function","title":"Lightning.ApolloClient.query/3","doc":"","ref":"Lightning.ApolloClient.html#query/3"},{"type":"function","title":"Lightning.ApolloClient.test/0","doc":"Checks if the Apollo endpoint is available.","ref":"Lightning.ApolloClient.html#test/0"},{"type":"type","title":"Lightning.ApolloClient.context/0","doc":"","ref":"Lightning.ApolloClient.html#t:context/0"},{"type":"module","title":"Lightning.Auditing","doc":"Context for working with Audit records.","ref":"Lightning.Auditing.html"},{"type":"function","title":"Lightning.Auditing.list_all/1","doc":"","ref":"Lightning.Auditing.html#list_all/1"},{"type":"behaviour","title":"Lightning.Auditing.Audit","doc":"Macro module to add common model behaviour to a given Ecto model","ref":"Lightning.Auditing.Audit.html"},{"type":"function","title":"Lightning.Auditing.Audit.event/6","doc":"Creates a `changeset` for the `event` identified by `item_id` and caused\nby `actor_id`.\n\nThe given `changes` can be either `nil`, `Ecto.Changeset`, struct or map.\n\nIt returns `:no_changes` in case of an `Ecto.Changeset` changes that changed nothing\nor an `Ecto.Changeset` with the event ready to be inserted.","ref":"Lightning.Auditing.Audit.html#event/6"},{"type":"function","title":"Lightning.Auditing.Audit.save/2","doc":"Saves the event to the `Repo`.\n\nIn case of nothing changes, do nothing.\n\nIt returns `{:ok, :no_changes}` if nothing changed, `{:ok, struct}` if the log\nhas been successfully saved or `{:error, changeset}` in case of error.","ref":"Lightning.Auditing.Audit.html#save/2"},{"type":"callback","title":"Lightning.Auditing.Audit.update_changes/1","doc":"","ref":"Lightning.Auditing.Audit.html#c:update_changes/1"},{"type":"module","title":"Lightning.AuthProviders","doc":"Context module for dealing with external Auth Providers.","ref":"Lightning.AuthProviders.html"},{"type":"function","title":"Lightning.AuthProviders.build_handler/2","doc":"","ref":"Lightning.AuthProviders.html#build_handler/2"},{"type":"function","title":"Lightning.AuthProviders.create/1","doc":"","ref":"Lightning.AuthProviders.html#create/1"},{"type":"function","title":"Lightning.AuthProviders.create_handler/1","doc":"","ref":"Lightning.AuthProviders.html#create_handler/1"},{"type":"function","title":"Lightning.AuthProviders.delete!/1","doc":"","ref":"Lightning.AuthProviders.html#delete!/1"},{"type":"function","title":"Lightning.AuthProviders.get_authorize_url/1","doc":"Retrieve the authorization url for a given handler or handler name.","ref":"Lightning.AuthProviders.html#get_authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.get_existing/0","doc":"","ref":"Lightning.AuthProviders.html#get_existing/0"},{"type":"function","title":"Lightning.AuthProviders.get_existing/1","doc":"","ref":"Lightning.AuthProviders.html#get_existing/1"},{"type":"function","title":"Lightning.AuthProviders.get_handler/1","doc":"","ref":"Lightning.AuthProviders.html#get_handler/1"},{"type":"function","title":"Lightning.AuthProviders.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.new/0","doc":"","ref":"Lightning.AuthProviders.html#new/0"},{"type":"function","title":"Lightning.AuthProviders.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.html#remove_handler/1"},{"type":"function","title":"Lightning.AuthProviders.update/2","doc":"","ref":"Lightning.AuthProviders.html#update/2"},{"type":"module","title":"Lightning.AuthProviders.AuthConfig","doc":"AuthProvider model","ref":"Lightning.AuthProviders.AuthConfig.html"},{"type":"type","title":"Lightning.AuthProviders.AuthConfig.t/0","doc":"","ref":"Lightning.AuthProviders.AuthConfig.html#t:t/0"},{"type":"module","title":"Lightning.AuthProviders.CacheWarmer","doc":"Dummy warmer which caches database rows every 30s.","ref":"Lightning.AuthProviders.CacheWarmer.html"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.AuthProviders.CacheWarmer.html#child_spec/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.execute/1","doc":"Executes this cache warmer with a connection.","ref":"Lightning.AuthProviders.CacheWarmer.html#execute/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.interval/0","doc":"Returns the interval for this warmer.","ref":"Lightning.AuthProviders.CacheWarmer.html#interval/0"},{"type":"module","title":"Lightning.AuthProviders.Common","doc":"Provides common functionality for handling OAuth authentication across different providers.","ref":"Lightning.AuthProviders.Common.html"},{"type":"function","title":"Lightning.AuthProviders.Common.authorize_url/4","doc":"Constructs the authorization URL with the given client, state, scopes, and options.","ref":"Lightning.AuthProviders.Common.html#authorize_url/4"},{"type":"function","title":"Lightning.AuthProviders.Common.build_client/3","doc":"Builds a new OAuth client with the specified configuration, authorization URL, token URL, and options.","ref":"Lightning.AuthProviders.Common.html#build_client/3"},{"type":"function","title":"Lightning.AuthProviders.Common.get_token/2","doc":"Requests an authentication token from the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Common.get_userinfo/3","doc":"Retrieves user information from the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#get_userinfo/3"},{"type":"function","title":"Lightning.AuthProviders.Common.get_wellknown/1","doc":"Fetches the well-known configuration from the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#get_wellknown/1"},{"type":"function","title":"Lightning.AuthProviders.Common.get_wellknown!/1","doc":"Fetches the well-known configuration from the OAuth provider and raises an error if not successful.","ref":"Lightning.AuthProviders.Common.html#get_wellknown!/1"},{"type":"function","title":"Lightning.AuthProviders.Common.introspect/3","doc":"","ref":"Lightning.AuthProviders.Common.html#introspect/3"},{"type":"function","title":"Lightning.AuthProviders.Common.refresh_token/2","doc":"Refreshes the authentication token using the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#refresh_token/2"},{"type":"function","title":"Lightning.AuthProviders.Common.still_fresh/3","doc":"Checks if a token is still valid or must be refreshed. If expires_at is nil,\nit will return `false`, forcing a refresh. If the token has already expired or\nwill expire before the default buffer (in the next 5 minutes) we return\n`false`, forcing a refresh.","ref":"Lightning.AuthProviders.Common.html#still_fresh/3"},{"type":"module","title":"Lightning.AuthProviders.Common.TokenBody","doc":"Defines a schema for OAuth token information.","ref":"Lightning.AuthProviders.Common.TokenBody.html"},{"type":"function","title":"Lightning.AuthProviders.Common.TokenBody.from_oauth2_token/1","doc":"Converts an OAuth2 token to a TokenBody struct.","ref":"Lightning.AuthProviders.Common.TokenBody.html#from_oauth2_token/1"},{"type":"function","title":"Lightning.AuthProviders.Common.TokenBody.new/1","doc":"Creates a new TokenBody struct with the given attributes.","ref":"Lightning.AuthProviders.Common.TokenBody.html#new/1"},{"type":"module","title":"Lightning.AuthProviders.Google","doc":"Handles the specifics of the Google OAuth authentication process.","ref":"Lightning.AuthProviders.Google.html"},{"type":"function","title":"Lightning.AuthProviders.Google.provider_name/0","doc":"","ref":"Lightning.AuthProviders.Google.html#provider_name/0"},{"type":"function","title":"Lightning.AuthProviders.Google.scopes/0","doc":"","ref":"Lightning.AuthProviders.Google.html#scopes/0"},{"type":"function","title":"Lightning.AuthProviders.Google.scopes_doc_url/0","doc":"","ref":"Lightning.AuthProviders.Google.html#scopes_doc_url/0"},{"type":"function","title":"Lightning.AuthProviders.Google.wellknown_url/1","doc":"","ref":"Lightning.AuthProviders.Google.html#wellknown_url/1"},{"type":"module","title":"Lightning.AuthProviders.Handler","doc":"Module which wraps Oauth configuration and a WellKnown document\ninto a convenient struct that can be used to authenticate users against\nany OIDC compliant provider.","ref":"Lightning.AuthProviders.Handler.html"},{"type":"function","title":"Lightning.AuthProviders.Handler.authorize_url/1","doc":"","ref":"Lightning.AuthProviders.Handler.html#authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.from_model/1","doc":"Returns a Handler from a given AuthConfig","ref":"Lightning.AuthProviders.Handler.html#from_model/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_token/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_userinfo/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_userinfo/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.new/2","doc":"Create a new Provider struct, expects a name and opts:\n\n- `:client_id` - The providers issued id\n- `:client_secret` - Secret for the client\n- `:redirect_uri` - The URI for redirecting after authentication,\n usually the callback url in the router.\n- `:wellknown` - A AuthProviders.WellKnown struct with the providers\n `.well-known/openid-configuration`.","ref":"Lightning.AuthProviders.Handler.html#new/2"},{"type":"type","title":"Lightning.AuthProviders.Handler.opts/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:opts/0"},{"type":"type","title":"Lightning.AuthProviders.Handler.t/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:t/0"},{"type":"behaviour","title":"Lightning.AuthProviders.OAuthBehaviour","doc":"Defines a behaviour for OAuth providers within the Lightning application,\nspecifying a common interface for OAuth operations.\nThis interface ensures consistency and interoperability among different\nauthentication providers (e.g., Google, Salesforce)\nby defining a set of required functions that each provider must implement.","ref":"Lightning.AuthProviders.OAuthBehaviour.html"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.authorize_url/4","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:authorize_url/4"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.build_client/1","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:build_client/1"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.get_token/3","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:get_token/3"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.get_userinfo/3","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:get_userinfo/3"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.refresh_token/2","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:refresh_token/2"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.refresh_token/3","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:refresh_token/3"},{"type":"module","title":"Lightning.AuthProviders.OauthHTTPClient","doc":"Handles OAuth interactions for generic providers, including token fetching,\nrefreshing, and user information retrieval. This module uses Tesla to make HTTP\nrequests configured with middleware appropriate for OAuth specific tasks.","ref":"Lightning.AuthProviders.OauthHTTPClient.html"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.delete/3","doc":"Perform a DELETE request.\n\nSee `request/1` or `request/2` for options definition.\n\n delete(\"/users\")\n delete(\"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\")\n delete(client, \"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#delete/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.delete!/3","doc":"Perform a DELETE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n delete!(\"/users\")\n delete!(\"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\")\n delete!(client, \"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#delete!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.fetch_token/2","doc":"Fetches a new token using the authorization code provided by the OAuth provider.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_token/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.fetch_token/2","doc":"- `client`: The client configuration containing client_id, client_secret, and token_endpoint.\n- `code`: The authorization code received from the OAuth provider.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_token/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.fetch_token/2","doc":"- `{:ok, token_data}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_token/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.fetch_userinfo/2","doc":"Fetches user information from the OAuth provider using a valid access token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_userinfo/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.fetch_userinfo/2","doc":"- `client`: The client configuration containing userinfo_endpoint.\n- `token`: The token configuration containing access_token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_userinfo/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.fetch_userinfo/2","doc":"- `{:ok, user_info}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_userinfo/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.generate_authorize_url/2","doc":"Generates an authorization URL with specified parameters.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#generate_authorize_url/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.generate_authorize_url/2","doc":"- `client`: The client configuration containing client_id, and authorization_endpoint.\n- `params`: Additional parameters to include in the authorization URL.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#generate_authorize_url/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.generate_authorize_url/2","doc":"- The fully formed authorization URL as a string.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#generate_authorize_url/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#get/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#get!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#head/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#head!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#options/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#options!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#patch/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#patch!/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.post/4","doc":"Perform a POST request.\n\nSee `request/1` or `request/2` for options definition.\n\n post(\"/users\", %{name: \"Jon\"})\n post(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post(client, \"/users\", %{name: \"Jon\"})\n post(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#post/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.post!/4","doc":"Perform a POST request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n post!(\"/users\", %{name: \"Jon\"})\n post!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post!(client, \"/users\", %{name: \"Jon\"})\n post!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#post!/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.put/4","doc":"Perform a PUT request.\n\nSee `request/1` or `request/2` for options definition.\n\n put(\"/users\", %{name: \"Jon\"})\n put(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put(client, \"/users\", %{name: \"Jon\"})\n put(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#put/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.put!/4","doc":"Perform a PUT request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n put!(\"/users\", %{name: \"Jon\"})\n put!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put!(client, \"/users\", %{name: \"Jon\"})\n put!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#put!/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.refresh_token/2","doc":"Refreshes an existing token using the refresh token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#refresh_token/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.refresh_token/2","doc":"- `client`: The client configuration containing client_id, client_secret, and token_endpoint.\n- `token`: The token configuration containing refresh_token","ref":"Lightning.AuthProviders.OauthHTTPClient.html#refresh_token/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.refresh_token/2","doc":"- `{:ok, refreshed_token_data}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#refresh_token/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.request/2","doc":"Perform a request.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request/2"},{"type":"function","title":"Options - Lightning.AuthProviders.OauthHTTPClient.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request/2-options"},{"type":"function","title":"Examples - Lightning.AuthProviders.OauthHTTPClient.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request/2-examples"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request!/2"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.revoke_token/2","doc":"Revokes an OAuth token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#revoke_token/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.revoke_token/2","doc":"- `client`: The client configuration containing client_id and client_secret.\n- `token`: The token to be revoked (access_token or refresh_token).","ref":"Lightning.AuthProviders.OauthHTTPClient.html#revoke_token/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.revoke_token/2","doc":"- `{:ok, response}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#revoke_token/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.still_fresh/3","doc":"Determines if the token data is still considered fresh.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#still_fresh/3"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.still_fresh/3","doc":"- `token`: a map containing token data with `expires_at` or `expires_in` keys.\n- `threshold`: the number of time units before expiration to consider the token still fresh.\n- `time_unit`: the unit of time to consider for the threshold comparison.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#still_fresh/3-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.still_fresh/3","doc":"- `true` if the token is fresh.\n- `{:error, reason}` if the token's expiration data is missing or invalid.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#still_fresh/3-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#trace/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#trace!/3"},{"type":"type","title":"Lightning.AuthProviders.OauthHTTPClient.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#t:option/0"},{"type":"module","title":"Lightning.AuthProviders.Salesforce","doc":"Handles the specifics of the Salesforce OAuth authentication process.","ref":"Lightning.AuthProviders.Salesforce.html"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.provider_name/0","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#provider_name/0"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.scopes/0","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#scopes/0"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.scopes_doc_url/0","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#scopes_doc_url/0"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.wellknown_url/1","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#wellknown_url/1"},{"type":"module","title":"Lightning.AuthProviders.Store","doc":"Store module for caching Handlers.\n\nSince Handlers often have to fetch their `.well-known` files when being\ninitialized we cache these in order to avoid repeatedly making HTTP requests\nto a providers API.","ref":"Lightning.AuthProviders.Store.html"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.Store.put_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#put_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.Store.html#remove_handler/1"},{"type":"type","title":"Lightning.AuthProviders.Store.finder/0","doc":"","ref":"Lightning.AuthProviders.Store.html#t:finder/0"},{"type":"module","title":"Lightning.AuthProviders.WellKnown","doc":"A datastructure to fetch and hold information about a given OIDC/OAuth provider","ref":"Lightning.AuthProviders.WellKnown.html"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete/3","doc":"Issues a DELETE request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch!/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch!/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get/3","doc":"Issues a GET request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head/3","doc":"Issues a HEAD request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.new/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#new/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options/3","doc":"Issues an OPTIONS request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch/4","doc":"Issues a PATCH request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post/4","doc":"Issues a POST request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_headers/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_body/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_headers/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_options/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_options/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_params/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_params/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_url/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_body/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_chunk/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_headers/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_status_code/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_status_code/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_url/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put/4","doc":"Issues a PUT request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/1","doc":"Issues an HTTP request using an `HTTPoison.Request` struct.\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AuthProviders.WellKnown.html#request/1"},{"type":"function","title":"Redirect handling - Lightning.AuthProviders.WellKnown.request/1","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AuthProviders.WellKnown.html#request/1-redirect-handling"},{"type":"function","title":"Examples - Lightning.AuthProviders.WellKnown.request/1","doc":"request = %HTTPoison.Request{\n method: :post,\n url: \"https://my.website.com\",\n body: \"{\\\"foo\\\": 3}\",\n headers: [{\"Accept\", \"application/json\"}]\n }\n\n request(request)","ref":"Lightning.AuthProviders.WellKnown.html#request/1-examples"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/5","doc":"Issues an HTTP request with the given method to the given url.\n\nThis function is usually used indirectly by `get/3`, `post/4`, `put/4`, etc\n\nArgs:\n * `method` - HTTP method as an atom (`:get`, `:head`, `:post`, `:put`,\n `:delete`, etc.)\n * `url` - target url as a binary string or char list\n * `body` - request body. See more below\n * `headers` - HTTP headers as an orddict (e.g., `[{\"Accept\", \"application/json\"}]`)\n * `options` - Keyword list of options\n\nBody: see type `HTTPoison.Request`\n\nOptions: see type `HTTPoison.Request`\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AuthProviders.WellKnown.html#request/5"},{"type":"function","title":"Redirect handling - Lightning.AuthProviders.WellKnown.request/5","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AuthProviders.WellKnown.html#request/5-redirect-handling"},{"type":"function","title":"Examples - Lightning.AuthProviders.WellKnown.request/5","doc":"request(:post, \"https://my.website.com\", \"{\\\"foo\\\": 3}\", [{\"Accept\", \"application/json\"}])","ref":"Lightning.AuthProviders.WellKnown.html#request/5-examples"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request!/1","doc":"Issues an HTTP request an `HTTPoison.Request` struct.\nexception in case of failure.\n\n`request!/1` works exactly like `request/1` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AuthProviders.WellKnown.html#request!/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an\nexception in case of failure.\n\n`request!/5` works exactly like `request/5` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AuthProviders.WellKnown.html#request!/5"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AuthProviders.WellKnown.html#start/0"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.stream_next/1","doc":"Requests the next message to be streamed for a given `HTTPoison.AsyncResponse`.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#stream_next/1"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.body/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:body/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.headers/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:headers/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.method/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:method/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.options/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:options/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.params/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:params/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.request/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:request/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.t/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:t/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.url/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:url/0"},{"type":"module","title":"Lightning.BuildMacros","doc":"Macros for building Lightning.","ref":"Lightning.BuildMacros.html"},{"type":"macro","title":"Lightning.BuildMacros.do_in/2","doc":"Conditionally evaluates the block if the current environment is in the\ngiven list of environments.","ref":"Lightning.BuildMacros.html#do_in/2"},{"type":"macro","title":"Examples - Lightning.BuildMacros.do_in/2","doc":"do_in(:dev) do\n IO.puts(\"This will only be printed in the dev environment\")\n end\n\n do_in([:dev, :test]) do\n IO.puts(\"This will only be printed in the dev and test environments\")\n end","ref":"Lightning.BuildMacros.html#do_in/2-examples"},{"type":"module","title":"Lightning.CLI","doc":"Module providing facilities to make calls to the OpenFn CLI.\n\nSee [@openfn/cli](https://github.com/OpenFn/kit/tree/main/packages/cli#openfncli)","ref":"Lightning.CLI.html"},{"type":"function","title":"Lightning.CLI.execute/1","doc":"Execute a command in a child process and parse the results.","ref":"Lightning.CLI.html#execute/1"},{"type":"function","title":"Lightning.CLI.metadata/2","doc":"Retrieve metadata for a given adaptor and configuration.","ref":"Lightning.CLI.html#metadata/2"},{"type":"module","title":"Lightning.CLI.Result","doc":"Struct that wraps the output of an OpenFn CLI call.\n\nContaining the keys:\n\n- `start_time`\n- `end_time`\n- `status`\n- `logs`","ref":"Lightning.CLI.Result.html"},{"type":"module","title":"Logs - Lightning.CLI.Result","doc":"The OpenFn CLI returns JSON formatted log lines, which are decoded and added\nto a `Result` struct.\n\nThere are two kinds of output:\n\n```\n{\"level\":\" >\",\"name\":\" >\",\"message\":\"...\"],\"time\": >}\n```\n\nThese are usually for general logging, and debugging.\n\n```\n{\"message\":[\" >\"]}\n```\n\nThe above is the equivalent of the output of a command","ref":"Lightning.CLI.Result.html#module-logs"},{"type":"function","title":"Lightning.CLI.Result.get_messages/1","doc":"Returns `message` type log lines from a `Result`.","ref":"Lightning.CLI.Result.html#get_messages/1"},{"type":"function","title":"Lightning.CLI.Result.new/1","doc":"","ref":"Lightning.CLI.Result.html#new/1"},{"type":"function","title":"Lightning.CLI.Result.parse/2","doc":"","ref":"Lightning.CLI.Result.html#parse/2"},{"type":"type","title":"Lightning.CLI.Result.t/0","doc":"","ref":"Lightning.CLI.Result.html#t:t/0"},{"type":"module","title":"Lightning.ChangesetUtils","doc":"Extra functions for Ecto.Changeset.","ref":"Lightning.ChangesetUtils.html"},{"type":"function","title":"Lightning.ChangesetUtils.put_if_provided/3","doc":"Puts a new change in the changeset if the params have the field.\n\nUseful when params don't have a given key and you don't want to set the\nfield to `nil`.","ref":"Lightning.ChangesetUtils.html#put_if_provided/3"},{"type":"function","title":"Lightning.ChangesetUtils.put_new_change/3","doc":"Puts a new change in the changeset if the field is not already set.\n\nNOTE: This function considers a field with a `nil` value as not set.","ref":"Lightning.ChangesetUtils.html#put_new_change/3"},{"type":"module","title":"Lightning.DashboardStats","doc":"Dashboard stats for a project and its workflows.","ref":"Lightning.DashboardStats.html"},{"type":"function","title":"Lightning.DashboardStats.aggregate_project_metrics/1","doc":"","ref":"Lightning.DashboardStats.html#aggregate_project_metrics/1"},{"type":"function","title":"Lightning.DashboardStats.filter_days_ago/2","doc":"","ref":"Lightning.DashboardStats.html#filter_days_ago/2"},{"type":"function","title":"Lightning.DashboardStats.get_workflow_stats/1","doc":"","ref":"Lightning.DashboardStats.html#get_workflow_stats/1"},{"type":"module","title":"Lightning.DashboardStats.ProjectMetrics","doc":"Aggregated metrics for a project.","ref":"Lightning.DashboardStats.ProjectMetrics.html"},{"type":"module","title":"Lightning.DashboardStats.WorkflowStats","doc":"Stats for each workflow.\n\nRuns and WorkOrders counting are grouped by state.","ref":"Lightning.DashboardStats.WorkflowStats.html"},{"type":"module","title":"Lightning.DataclipScrubber","doc":"Handles scrubbing of dataclips","ref":"Lightning.DataclipScrubber.html"},{"type":"function","title":"Lightning.DataclipScrubber.scrub_dataclip_body!/1","doc":"","ref":"Lightning.DataclipScrubber.html#scrub_dataclip_body!/1"},{"type":"module","title":"Lightning.Demo","doc":"Demo encapsulates logic for setting up a demonstration site.","ref":"Lightning.Demo.html"},{"type":"function","title":"Lightning.Demo.reset_demo/0","doc":"Deletes everything in the database including the superuser and creates a set\nof publicly available users for a demo site via a command that can be run on\nKubernetes-deployed systems.","ref":"Lightning.Demo.html#reset_demo/0"},{"type":"module","title":"Lightning.ExportUtils","doc":"Module that expose a function generating a complete and valid yaml string\nfrom a project and its workflows.","ref":"Lightning.ExportUtils.html"},{"type":"function","title":"Lightning.ExportUtils.build_yaml_tree/2","doc":"","ref":"Lightning.ExportUtils.html#build_yaml_tree/2"},{"type":"function","title":"Lightning.ExportUtils.generate_new_yaml/2","doc":"","ref":"Lightning.ExportUtils.html#generate_new_yaml/2"},{"type":"behaviour","title":"Lightning.Extensions.AccountHooking","doc":"Allows handling user creation or registration atomically without relying on async events.","ref":"Lightning.Extensions.AccountHooking.html"},{"type":"callback","title":"Lightning.Extensions.AccountHooking.handle_create_user/1","doc":"","ref":"Lightning.Extensions.AccountHooking.html#c:handle_create_user/1"},{"type":"callback","title":"Lightning.Extensions.AccountHooking.handle_register_superuser/1","doc":"","ref":"Lightning.Extensions.AccountHooking.html#c:handle_register_superuser/1"},{"type":"callback","title":"Lightning.Extensions.AccountHooking.handle_register_user/1","doc":"","ref":"Lightning.Extensions.AccountHooking.html#c:handle_register_user/1"},{"type":"module","title":"Lightning.Extensions.FifoRunQueue","doc":"Allows adding, removing or claiming work to be executed by the Runtime.","ref":"Lightning.Extensions.FifoRunQueue.html"},{"type":"module","title":"Lightning.Extensions.Message","doc":"Message for the limiters to communicate with the client.","ref":"Lightning.Extensions.Message.html"},{"type":"type","title":"Lightning.Extensions.Message.t/0","doc":"","ref":"Lightning.Extensions.Message.html#t:t/0"},{"type":"module","title":"Lightning.Extensions.ProjectHook","doc":"Allows handling user creation or registration atomically without relying on async events.","ref":"Lightning.Extensions.ProjectHook.html"},{"type":"function","title":"Lightning.Extensions.ProjectHook.handle_create_project/1","doc":"","ref":"Lightning.Extensions.ProjectHook.html#handle_create_project/1"},{"type":"function","title":"Lightning.Extensions.ProjectHook.handle_delete_project/1","doc":"","ref":"Lightning.Extensions.ProjectHook.html#handle_delete_project/1"},{"type":"behaviour","title":"Lightning.Extensions.ProjectHooking","doc":"Allows handling project creation atomically without relying on async events.","ref":"Lightning.Extensions.ProjectHooking.html"},{"type":"callback","title":"Lightning.Extensions.ProjectHooking.handle_create_project/1","doc":"","ref":"Lightning.Extensions.ProjectHooking.html#c:handle_create_project/1"},{"type":"callback","title":"Lightning.Extensions.ProjectHooking.handle_delete_project/1","doc":"","ref":"Lightning.Extensions.ProjectHooking.html#c:handle_delete_project/1"},{"type":"module","title":"Lightning.Extensions.RateLimiter","doc":"Rate limiting stub for Lightning.","ref":"Lightning.Extensions.RateLimiter.html"},{"type":"behaviour","title":"Lightning.Extensions.RateLimiting","doc":"Rate limiting for Lightning API endpoints.","ref":"Lightning.Extensions.RateLimiting.html"},{"type":"callback","title":"Lightning.Extensions.RateLimiting.limit_request/3","doc":"","ref":"Lightning.Extensions.RateLimiting.html#c:limit_request/3"},{"type":"type","title":"Lightning.Extensions.RateLimiting.message/0","doc":"","ref":"Lightning.Extensions.RateLimiting.html#t:message/0"},{"type":"type","title":"Lightning.Extensions.RateLimiting.request_error/0","doc":"","ref":"Lightning.Extensions.RateLimiting.html#t:request_error/0"},{"type":"module","title":"Lightning.Extensions.RateLimiting.Context","doc":"Which user is making the request for a certain project.","ref":"Lightning.Extensions.RateLimiting.Context.html"},{"type":"type","title":"Lightning.Extensions.RateLimiting.Context.t/0","doc":"","ref":"Lightning.Extensions.RateLimiting.Context.html#t:t/0"},{"type":"behaviour","title":"Lightning.Extensions.RunQueue","doc":"Extension to customize the scheduling of workloads on Lightning Runtime.","ref":"Lightning.Extensions.RunQueue.html"},{"type":"callback","title":"Lightning.Extensions.RunQueue.claim/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:claim/1"},{"type":"callback","title":"Lightning.Extensions.RunQueue.dequeue/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:dequeue/1"},{"type":"callback","title":"Lightning.Extensions.RunQueue.enqueue/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:enqueue/1"},{"type":"callback","title":"Lightning.Extensions.RunQueue.enqueue_many/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:enqueue_many/1"},{"type":"module","title":"Lightning.Extensions.UsageLimiter","doc":"Runtime limiting stub for Lightning.","ref":"Lightning.Extensions.UsageLimiter.html"},{"type":"behaviour","title":"Lightning.Extensions.UsageLimiting","doc":"Rate limiting for Lightning workloads that depends on Runtime.","ref":"Lightning.Extensions.UsageLimiting.html"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.check_limits/1","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:check_limits/1"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.get_run_options/1","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:get_run_options/1"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.increment_ai_queries/1","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:increment_ai_queries/1"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.limit_action/2","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:limit_action/2"},{"type":"type","title":"Lightning.Extensions.UsageLimiting.error/0","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#t:error/0"},{"type":"type","title":"Lightning.Extensions.UsageLimiting.error_reason/0","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#t:error_reason/0"},{"type":"type","title":"Lightning.Extensions.UsageLimiting.message/0","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#t:message/0"},{"type":"module","title":"Lightning.FailureNotifierView","doc":"","ref":"Lightning.FailureNotifierView.html"},{"type":"function","title":"Lightning.FailureNotifierView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"Lightning.FailureNotifierView.html#__resource__/0"},{"type":"function","title":"Lightning.FailureNotifierView.failure_alert.html/1","doc":"","ref":"Lightning.FailureNotifierView.html#failure_alert.html/1"},{"type":"function","title":"Lightning.FailureNotifierView.render/2","doc":"Renders the given template locally.","ref":"Lightning.FailureNotifierView.html#render/2"},{"type":"function","title":"Lightning.FailureNotifierView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"Lightning.FailureNotifierView.html#template_not_found/2"},{"type":"module","title":"Lightning.Graph","doc":"A graph model for workflows transversal.","ref":"Lightning.Graph.html"},{"type":"function","title":"Lightning.Graph.add_edge/3","doc":"","ref":"Lightning.Graph.html#add_edge/3"},{"type":"function","title":"Lightning.Graph.new/0","doc":"","ref":"Lightning.Graph.html#new/0"},{"type":"function","title":"Lightning.Graph.nodes/2","doc":"","ref":"Lightning.Graph.html#nodes/2"},{"type":"function","title":"Lightning.Graph.prune/2","doc":"","ref":"Lightning.Graph.html#prune/2"},{"type":"function","title":"Lightning.Graph.remove_edges/2","doc":"","ref":"Lightning.Graph.html#remove_edges/2"},{"type":"type","title":"Lightning.Graph.t/0","doc":"","ref":"Lightning.Graph.html#t:t/0"},{"type":"module","title":"Lightning.Helpers","doc":"Common functions for the context","ref":"Lightning.Helpers.html"},{"type":"function","title":"Lightning.Helpers.actual_deletion_date/3","doc":"","ref":"Lightning.Helpers.html#actual_deletion_date/3"},{"type":"function","title":"Lightning.Helpers.coerce_json_field/2","doc":"Changes a given maps field from a json string to a map.\nIf it cannot be converted, it leaves the original value","ref":"Lightning.Helpers.html#coerce_json_field/2"},{"type":"function","title":"Lightning.Helpers.format_date/2","doc":"","ref":"Lightning.Helpers.html#format_date/2"},{"type":"function","title":"Lightning.Helpers.json_safe/1","doc":"Recursively ensures a given map is safe to convert to JSON,\nwhere all keys are strings and all values are json safe (primitive values).","ref":"Lightning.Helpers.html#json_safe/1"},{"type":"function","title":"Lightning.Helpers.ms_to_human/1","doc":"Converts milliseconds (integer) to a human duration, such as \"1 minute\" or\n\"45 years, 6 months, 5 days, 21 hours, 12 minutes, 34 seconds\" using\n`Timex.Format.Duration.Formatters.Humanized.format()`.","ref":"Lightning.Helpers.html#ms_to_human/1"},{"type":"module","title":"Lightning.Janitor","doc":"The Janitor is responsible for detecting runs that have been \"lost\" due to\ncommunication issues with the worker.\n\nEvery X minutes the Janitor will check to ensure that no runs have been\nrunning for more than Y seconds.\n\nConfigure your maximum run runtime with a WORKER_MAX_RUN_DURATION_SECONDS environment\nvariable; the grace period will be an additional 20%.","ref":"Lightning.Janitor.html"},{"type":"function","title":"Lightning.Janitor.find_and_update_lost/0","doc":"The find_and_update_lost function determines the current time, finds all\nruns that were claimed before the earliest allowable claim time for\nunfinished runs, and marks them as lost.","ref":"Lightning.Janitor.html#find_and_update_lost/0"},{"type":"function","title":"Lightning.Janitor.perform/1","doc":"The perform function takes an `%Oban.Job`, allowing this module to be invoked\nby the Oban cron plugin.","ref":"Lightning.Janitor.html#perform/1"},{"type":"module","title":"Lightning.KafkaTriggers","doc":"Contains the logic to manage kafka trigger and their associated pipelines.","ref":"Lightning.KafkaTriggers.html"},{"type":"function","title":"Lightning.KafkaTriggers.build_topic_partition_offset/1","doc":"Generate the key that is used to identify duplicate messages when used in\nassociation with the trigger id.","ref":"Lightning.KafkaTriggers.html#build_topic_partition_offset/1"},{"type":"function","title":"Lightning.KafkaTriggers.convert_rate_limit/0","doc":"","ref":"Lightning.KafkaTriggers.html#convert_rate_limit/0"},{"type":"function","title":"Lightning.KafkaTriggers.enable_disable_triggers/1","doc":"","ref":"Lightning.KafkaTriggers.html#enable_disable_triggers/1"},{"type":"function","title":"Lightning.KafkaTriggers.find_enabled_triggers/0","doc":"","ref":"Lightning.KafkaTriggers.html#find_enabled_triggers/0"},{"type":"function","title":"Lightning.KafkaTriggers.generate_pipeline_child_spec/1","doc":"Generate the child spec needed to start a `Pipeline` child process.","ref":"Lightning.KafkaTriggers.html#generate_pipeline_child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.get_kafka_triggers_being_updated/1","doc":"","ref":"Lightning.KafkaTriggers.html#get_kafka_triggers_being_updated/1"},{"type":"function","title":"Lightning.KafkaTriggers.initial_policy/1","doc":"","ref":"Lightning.KafkaTriggers.html#initial_policy/1"},{"type":"function","title":"Lightning.KafkaTriggers.start_triggers/0","doc":"","ref":"Lightning.KafkaTriggers.html#start_triggers/0"},{"type":"function","title":"Lightning.KafkaTriggers.update_pipeline/2","doc":"","ref":"Lightning.KafkaTriggers.html#update_pipeline/2"},{"type":"module","title":"Lightning.KafkaTriggers.DuplicateTrackingCleanupWorker","doc":"Responsible for cleaning up stale TriggerKafkaMessageRecords entries.\nTriggerKafkaMessageRecords are used to deduplicate incoming messages from\na Kafka cluster.","ref":"Lightning.KafkaTriggers.DuplicateTrackingCleanupWorker.html"},{"type":"module","title":"Lightning.KafkaTriggers.EventListener","doc":"Listens for events related to Kafka triggers and updates the affected pipeline\nprocess by enabling, reloading or disabling it.","ref":"Lightning.KafkaTriggers.EventListener.html"},{"type":"function","title":"Lightning.KafkaTriggers.EventListener.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.KafkaTriggers.EventListener.html#child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.EventListener.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.EventListener.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.MessageHandling","doc":"Contains the logic to persist a Kafka messages as a WorkOrder, Run and\nDataclip.","ref":"Lightning.KafkaTriggers.MessageHandling.html"},{"type":"function","title":"Lightning.KafkaTriggers.MessageHandling.persist_message/3","doc":"","ref":"Lightning.KafkaTriggers.MessageHandling.html#persist_message/3"},{"type":"module","title":"Lightning.KafkaTriggers.Pipeline","doc":"Broadway pipeline that processes messages from Kafka clusters and persists\nthe received messages if they are not duplicating a previous message.","ref":"Lightning.KafkaTriggers.Pipeline.html"},{"type":"function","title":"Lightning.KafkaTriggers.Pipeline.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.Pipeline.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.PipelineSupervisor","doc":"Supervisor of the BroadwayKafka pipelines that are created for each enabled\nKafka trigger.","ref":"Lightning.KafkaTriggers.PipelineSupervisor.html"},{"type":"function","title":"Lightning.KafkaTriggers.PipelineSupervisor.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.KafkaTriggers.PipelineSupervisor.html#child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.PipelineSupervisor.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.PipelineSupervisor.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.Supervisor","doc":"Starts all the processes needed to pull data from Kafka clusters and then\ngenerate work orders based on the messages received.","ref":"Lightning.KafkaTriggers.Supervisor.html"},{"type":"function","title":"Lightning.KafkaTriggers.Supervisor.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.KafkaTriggers.Supervisor.html#child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.Supervisor.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.Supervisor.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord","doc":"Persists a lightweight represenattion of a message that has been recevied from\na Kafka cluster, for the purpose of deduplication.","ref":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord.html"},{"type":"function","title":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord.changeset/2","doc":"","ref":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord.html#changeset/2"},{"type":"module","title":"Lightning.MetadataService","doc":"Retrieves metadata for a given credential and adaptor using the OpenFn CLI.","ref":"Lightning.MetadataService.html"},{"type":"function","title":"Lightning.MetadataService.fetch/2","doc":"Retrieve metadata for a given adaptor and credential.\n\nThe adaptor must be an npm specification.","ref":"Lightning.MetadataService.html#fetch/2"},{"type":"exception","title":"Lightning.MetadataService.Error","doc":"","ref":"Lightning.MetadataService.Error.html"},{"type":"function","title":"Lightning.MetadataService.Error.message/1","doc":"","ref":"Lightning.MetadataService.Error.html#message/1"},{"type":"function","title":"Lightning.MetadataService.Error.new/1","doc":"","ref":"Lightning.MetadataService.Error.html#new/1"},{"type":"type","title":"Lightning.MetadataService.Error.t/0","doc":"","ref":"Lightning.MetadataService.Error.html#t:t/0"},{"type":"module","title":"Lightning.Name","doc":"Generates a random names.","ref":"Lightning.Name.html"},{"type":"function","title":"Lightning.Name.generate/1","doc":"","ref":"Lightning.Name.html#generate/1"},{"type":"module","title":"Lightning.OauthClients","doc":"Manages operations for OAuth clients within the Lightning application, providing\nfunctions to create, retrieve, update, and delete OAuth clients, as well as managing\ntheir associations with projects and handling audit trails for changes.","ref":"Lightning.OauthClients.html"},{"type":"function","title":"Lightning.OauthClients.change_client/2","doc":"Prepares a changeset for creating or updating an OAuth client.","ref":"Lightning.OauthClients.html#change_client/2"},{"type":"function","title":"Parameters - Lightning.OauthClients.change_client/2","doc":"- client: The OAuth client struct.\n - attrs: Attributes to update in the client.","ref":"Lightning.OauthClients.html#change_client/2-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.change_client/2","doc":"- An Ecto.Changeset struct for the OAuth client.","ref":"Lightning.OauthClients.html#change_client/2-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.change_client/2","doc":"iex> change_client(%OauthClient{}, %{name: \"New Client\"})\n %Ecto.Changeset{...}","ref":"Lightning.OauthClients.html#change_client/2-examples"},{"type":"function","title":"Lightning.OauthClients.create_client/1","doc":"Creates a new OAuth client with the specified attributes.","ref":"Lightning.OauthClients.html#create_client/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.create_client/1","doc":"- attrs: Map containing attributes for the new OAuth client.\n Required fields: `name`, `authorization_endpoint`, `token_endpoint`, `revocation_endpoint`, `client_id`, `client_secret`.","ref":"Lightning.OauthClients.html#create_client/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.create_client/1","doc":"- `{:ok, oauth_client}` if the client is created successfully.\n - `{:error, changeset}` if there is an error during creation due to validation failures or database issues.","ref":"Lightning.OauthClients.html#create_client/1-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.create_client/1","doc":"iex> create_client(%{name: \"New Client\"})\n {:ok, %OauthClient{}}\n\n iex> create_client(%{name: nil})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.OauthClients.html#create_client/1-examples"},{"type":"function","title":"Lightning.OauthClients.delete_client/1","doc":"Deletes an OAuth client and all associated data.","ref":"Lightning.OauthClients.html#delete_client/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.delete_client/1","doc":"- client: The OauthClient to delete.","ref":"Lightning.OauthClients.html#delete_client/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.delete_client/1","doc":"- A tuple {:ok, oauth_client} if deletion is successful.\n- A tuple {:error, changeset} if deletion fails.","ref":"Lightning.OauthClients.html#delete_client/1-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.delete_client/1","doc":"iex> delete_client(client)\n {:ok, %OauthClient{}}\n\n iex> delete_client(client)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.OauthClients.html#delete_client/1-examples"},{"type":"function","title":"Lightning.OauthClients.get_client!/1","doc":"Retrieves a single OAuth client by its ID, raising an error if not found.","ref":"Lightning.OauthClients.html#get_client!/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.get_client!/1","doc":"- id: The ID of the OAuth client to retrieve.","ref":"Lightning.OauthClients.html#get_client!/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.get_client!/1","doc":"- The OAuth client struct.","ref":"Lightning.OauthClients.html#get_client!/1-returns"},{"type":"function","title":"Raises - Lightning.OauthClients.get_client!/1","doc":"- Ecto.NoResultsError if the OAuth client does not exist.","ref":"Lightning.OauthClients.html#get_client!/1-raises"},{"type":"function","title":"Examples - Lightning.OauthClients.get_client!/1","doc":"iex> get_client!(123)\n %OauthClient{}\n\n iex> get_client!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.OauthClients.html#get_client!/1-examples"},{"type":"function","title":"Lightning.OauthClients.list_clients/1","doc":"Retrieves all OAuth clients based on the given context, either a Project or a User.","ref":"Lightning.OauthClients.html#list_clients/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.list_clients/1","doc":"- context: The Project or User struct to retrieve OAuth clients for.","ref":"Lightning.OauthClients.html#list_clients/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.list_clients/1","doc":"- A list of OAuth clients associated with the given Project or created by the given User.","ref":"Lightning.OauthClients.html#list_clients/1-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.list_clients/1","doc":"When given a Project:\n iex> list_clients(%Project{id: 1})\n [%OauthClient{project_id: 1}, %OauthClient{project_id: 1}]\n\n When given a User:\n iex> list_clients(%User{id: 123})\n [%OauthClient{user_id: 123}, %OauthClient{user_id: 123}]","ref":"Lightning.OauthClients.html#list_clients/1-examples"},{"type":"function","title":"Lightning.OauthClients.update_client/2","doc":"Updates an existing OAuth client with the specified attributes.","ref":"Lightning.OauthClients.html#update_client/2"},{"type":"function","title":"Parameters - Lightning.OauthClients.update_client/2","doc":"- client: The existing OauthClient to update.\n- attrs: A map of attributes to update.","ref":"Lightning.OauthClients.html#update_client/2-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.update_client/2","doc":"- A tuple {:ok, oauth_client} if update is successful.\n- A tuple {:error, changeset} if update fails.","ref":"Lightning.OauthClients.html#update_client/2-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.update_client/2","doc":"iex> update_client(client, %{field: new_value})\n {:ok, %OauthClient{}}\n\n iex> update_client(client, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.OauthClients.html#update_client/2-examples"},{"type":"module","title":"Lightning.ObanManager","doc":"The Oban Manager","ref":"Lightning.ObanManager.html"},{"type":"function","title":"Lightning.ObanManager.handle_event/4","doc":"","ref":"Lightning.ObanManager.html#handle_event/4"},{"type":"module","title":"Lightning.Policies.Dataclips","doc":"The Bodyguard Policy module for dataclips actions","ref":"Lightning.Policies.Dataclips.html"},{"type":"function","title":"Lightning.Policies.Dataclips.authorize/3","doc":"","ref":"Lightning.Policies.Dataclips.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Dataclips.actions/0","doc":"","ref":"Lightning.Policies.Dataclips.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Exports","doc":"The Bodyguard Policy module for Exports","ref":"Lightning.Policies.Exports.html"},{"type":"function","title":"Lightning.Policies.Exports.authorize/3","doc":"","ref":"Lightning.Policies.Exports.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Exports.actions/0","doc":"","ref":"Lightning.Policies.Exports.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Permissions","doc":"This module defines a unique interface managing authorizations in Lightning.\n\nUsers in Lightning have instance-wide and project-wide roles which determine their level of access to resources in the application. Fo rmore details see the [documentation](https://docs.openfn.org/documentation/about-lightning#roles-and-permissions).\n\nThese authorizations policies are all implemented under the `lib/lightning/policies` folder. In that folder you can find 3 files:\n- The `users.ex` file has all the policies for the instances wide access levels\n- The `project_users.ex` file has all the policies for the project wide access levels\n- The `permissions.ex` file defines the `Lightning.Policies.Permissions.can/4` interface. Which is a wrapper around the `Bodyguard.permit/4` function.\nWe use that interface to be able to harmonize the use of policies accross the entire app.\n\nAll the policies are tested in the `test/lightning/policies` folder. And the test are written in a way that allows the reader to quickly who can do what in the app.\n\nWe have two variants of the `Lightning.Policies.Permissions.can/4` interface:\n- `Lightning.Policies.Permissions.can(policy, action, actor, resource)` returns `:ok` if the actor can perform the action on the resource and `{:error, :unauthorized}` otherwise.\n- `Lightning.Policies.Permissions.can?(policy, action, actor, resource)` returns `true` if the actor can perform the action on the resource and `false` otherwise.\n\nHere is an example of how we the `Lightning.Policies.Permissions.can/4` interface to check if the a user can edit a job or not\n```elixir\ncan_edit_workflow = Lightning.Policies.ProjectUsers |> Lightning.Policies.Permissions.can?(:edit_workflow, socket.assigns.current_user, socket.assigns.project)\n\nif can_edit_workflow do\n # allow user to edit the workflow\nelse\n # quick user out\nend\n```","ref":"Lightning.Policies.Permissions.html"},{"type":"function","title":"Lightning.Policies.Permissions.can/4","doc":"checks if user has the permissions to apply action using some policy module\n\nReturns `:ok` if user can apply action and `{:error, :unauthorized}` otherwise","ref":"Lightning.Policies.Permissions.html#can/4"},{"type":"function","title":"Examples - Lightning.Policies.Permissions.can/4","doc":"iex> can(Lightning.Policies.Users, :create_workflow, user, project)\n :ok\n\n iex> can(Lightning.Policies.Users, :create_project, user, %{})\n {:error, :unauthorized}","ref":"Lightning.Policies.Permissions.html#can/4-examples"},{"type":"function","title":"Lightning.Policies.Permissions.can?/4","doc":"same as can/4 but returns `true` if user can apply action and `false` otherwise","ref":"Lightning.Policies.Permissions.html#can?/4"},{"type":"function","title":"Examples - Lightning.Policies.Permissions.can?/4","doc":"iex> can(Lightning.Policies.Users, :create_workflow, user, project)\n true\n\n iex> can(Lightning.Policies.Users, :create_project, user, %{})\n false","ref":"Lightning.Policies.Permissions.html#can?/4-examples"},{"type":"module","title":"Lightning.Policies.ProjectUsers","doc":"The Bodyguard Policy module for projects members roles.","ref":"Lightning.Policies.ProjectUsers.html"},{"type":"function","title":"Lightning.Policies.ProjectUsers.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role\nfor this project and returns `true` if the user can perform the action in\nthat project and `false` if they cannot.\n\nNote that permissions are grouped by action, rather than by user role.\n\nWe deny by default, so if a user's role is not added to the allow roles list\nfor a particular action they are denied.","ref":"Lightning.Policies.ProjectUsers.html#authorize/3"},{"type":"type","title":"Lightning.Policies.ProjectUsers.actions/0","doc":"","ref":"Lightning.Policies.ProjectUsers.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Provisioning","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Provisioning.html"},{"type":"function","title":"Lightning.Policies.Provisioning.authorize/3","doc":"authorize/3 takes an action, a user or a project repo connection, and a project. It checks the user's role\nfor this project and returns `true` if the user can perform the action and\nfalse if they cannot.\n\nNote that permissions are grouped by action.\n\nWe deny by default, so if a user's role is not added to the allow roles list\nfor a particular action they are denied.\n\nOnly a superuser can provision a new project.\n\nOwners and admins can update existing projects.","ref":"Lightning.Policies.Provisioning.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Provisioning.actions/0","doc":"","ref":"Lightning.Policies.Provisioning.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Users","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Users.html"},{"type":"function","title":"Lightning.Policies.Users.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role\nfor this project and returns `true` if the user can perform the action and\nfalse if they cannot.\n\nNote that permissions are grouped by action.\n\nWe deny by default, so if a user's role is not added to the allow roles list\nfor a particular action they are denied.","ref":"Lightning.Policies.Users.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Users.actions/0","doc":"","ref":"Lightning.Policies.Users.html#t:actions/0"},{"type":"module","title":"Lightning.PromEx","doc":"Be sure to add the following to finish setting up PromEx:\n\n1. Update your configuration (config.exs, dev.exs, prod.exs, releases.exs, etc) to\n configure the necessary bit of PromEx. Be sure to check out `PromEx.Config` for\n more details regarding configuring PromEx:\n ```\n config :lightning, Lightning.PromEx,\n disabled: false,\n manual_metrics_start_delay: :no_delay,\n drop_metrics_groups: [],\n grafana: :disabled,\n metrics_server: :disabled\n ```\n\n2. Add this module to your application supervision tree. It should be one of the first\n things that is started so that no Telemetry events are missed. For example, if PromEx\n is started after your Repo module, you will miss Ecto's init events and the dashboards\n will be missing some data points:\n ```\n def start(_type, _args) do\n children = [\n Lightning.PromEx,\n\n ...\n ]\n\n ...\n end\n ```\n\n3. Update your `endpoint.ex` file to expose your metrics (or configure a standalone\n server using the `:metrics_server` config options). Be sure to put this plug before\n your `Plug.Telemetry` entry so that you can avoid having calls to your `/metrics`\n endpoint create their own metrics and logs which can pollute your logs/metrics given\n that Prometheus will scrape at a regular interval and that can get noisy:\n ```\n defmodule LightningWeb.Endpoint do\n use Phoenix.Endpoint, otp_app: :lightning\n\n ...\n\n plug PromEx.Plug, prom_ex_module: Lightning.PromEx\n\n ...\n end\n ```\n\n4. Update the list of plugins in the `plugins/0` function return list to reflect your\n application's dependencies. Also update the list of dashboards that are to be uploaded\n to Grafana in the `dashboards/0` function.","ref":"Lightning.PromEx.html"},{"type":"function","title":"Lightning.PromEx.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.PromEx.html#child_spec/1"},{"type":"module","title":"Lightning.Release","doc":"Used for executing DB release tasks when run in production without Mix\ninstalled.","ref":"Lightning.Release.html"},{"type":"function","title":"Lightning.Release.create_db/0","doc":"","ref":"Lightning.Release.html#create_db/0"},{"type":"function","title":"Lightning.Release.load_app/0","doc":"","ref":"Lightning.Release.html#load_app/0"},{"type":"function","title":"Lightning.Release.migrate/0","doc":"","ref":"Lightning.Release.html#migrate/0"},{"type":"function","title":"Lightning.Release.rollback/2","doc":"","ref":"Lightning.Release.html#rollback/2"},{"type":"module","title":"Lightning.Repo","doc":"","ref":"Lightning.Repo.html"},{"type":"function","title":"Lightning.Repo.aggregate/3","doc":"","ref":"Lightning.Repo.html#aggregate/3"},{"type":"function","title":"Lightning.Repo.aggregate/4","doc":"","ref":"Lightning.Repo.html#aggregate/4"},{"type":"function","title":"Lightning.Repo.all/2","doc":"","ref":"Lightning.Repo.html#all/2"},{"type":"function","title":"Lightning.Repo.checked_out?/0","doc":"","ref":"Lightning.Repo.html#checked_out?/0"},{"type":"function","title":"Lightning.Repo.checkout/2","doc":"","ref":"Lightning.Repo.html#checkout/2"},{"type":"function","title":"Lightning.Repo.child_spec/1","doc":"","ref":"Lightning.Repo.html#child_spec/1"},{"type":"function","title":"Lightning.Repo.config/0","doc":"","ref":"Lightning.Repo.html#config/0"},{"type":"function","title":"Lightning.Repo.default_options/1","doc":"","ref":"Lightning.Repo.html#default_options/1"},{"type":"function","title":"Lightning.Repo.delete/2","doc":"","ref":"Lightning.Repo.html#delete/2"},{"type":"function","title":"Lightning.Repo.delete!/2","doc":"","ref":"Lightning.Repo.html#delete!/2"},{"type":"function","title":"Lightning.Repo.delete_all/2","doc":"","ref":"Lightning.Repo.html#delete_all/2"},{"type":"function","title":"Lightning.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Lightning.Repo.html#disconnect_all/2"},{"type":"function","title":"Lightning.Repo.exists?/2","doc":"","ref":"Lightning.Repo.html#exists?/2"},{"type":"function","title":"Lightning.Repo.explain/3","doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar\ndepending on the adapter to obtain statistics for the given query.\n\nSee `Ecto.Adapters.SQL.explain/4` for more information.","ref":"Lightning.Repo.html#explain/3"},{"type":"function","title":"Lightning.Repo.get/3","doc":"","ref":"Lightning.Repo.html#get/3"},{"type":"function","title":"Lightning.Repo.get!/3","doc":"","ref":"Lightning.Repo.html#get!/3"},{"type":"function","title":"Lightning.Repo.get_by/3","doc":"","ref":"Lightning.Repo.html#get_by/3"},{"type":"function","title":"Lightning.Repo.get_by!/3","doc":"","ref":"Lightning.Repo.html#get_by!/3"},{"type":"function","title":"Lightning.Repo.get_dynamic_repo/0","doc":"","ref":"Lightning.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Lightning.Repo.in_transaction?/0","doc":"","ref":"Lightning.Repo.html#in_transaction?/0"},{"type":"function","title":"Lightning.Repo.insert/2","doc":"","ref":"Lightning.Repo.html#insert/2"},{"type":"function","title":"Lightning.Repo.insert!/2","doc":"","ref":"Lightning.Repo.html#insert!/2"},{"type":"function","title":"Lightning.Repo.insert_all/3","doc":"","ref":"Lightning.Repo.html#insert_all/3"},{"type":"function","title":"Lightning.Repo.insert_or_update/2","doc":"","ref":"Lightning.Repo.html#insert_or_update/2"},{"type":"function","title":"Lightning.Repo.insert_or_update!/2","doc":"","ref":"Lightning.Repo.html#insert_or_update!/2"},{"type":"function","title":"Lightning.Repo.load/2","doc":"","ref":"Lightning.Repo.html#load/2"},{"type":"function","title":"Lightning.Repo.one/2","doc":"","ref":"Lightning.Repo.html#one/2"},{"type":"function","title":"Lightning.Repo.one!/2","doc":"","ref":"Lightning.Repo.html#one!/2"},{"type":"function","title":"Lightning.Repo.paginate/2","doc":"","ref":"Lightning.Repo.html#paginate/2"},{"type":"function","title":"Lightning.Repo.preload/3","doc":"","ref":"Lightning.Repo.html#preload/3"},{"type":"function","title":"Lightning.Repo.prepare_query/3","doc":"","ref":"Lightning.Repo.html#prepare_query/3"},{"type":"function","title":"Lightning.Repo.put_dynamic_repo/1","doc":"","ref":"Lightning.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Lightning.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Lightning.Repo.html#query/3"},{"type":"function","title":"Lightning.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Lightning.Repo.html#query!/3"},{"type":"function","title":"Lightning.Repo.query_many/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many/4` for more information.","ref":"Lightning.Repo.html#query_many/3"},{"type":"function","title":"Lightning.Repo.query_many!/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many!/4` for more information.","ref":"Lightning.Repo.html#query_many!/3"},{"type":"function","title":"Lightning.Repo.reload/2","doc":"","ref":"Lightning.Repo.html#reload/2"},{"type":"function","title":"Lightning.Repo.reload!/2","doc":"","ref":"Lightning.Repo.html#reload!/2"},{"type":"function","title":"Lightning.Repo.rollback/1","doc":"","ref":"Lightning.Repo.html#rollback/1"},{"type":"function","title":"Lightning.Repo.scrivener_defaults/0","doc":"","ref":"Lightning.Repo.html#scrivener_defaults/0"},{"type":"function","title":"Lightning.Repo.start_link/1","doc":"","ref":"Lightning.Repo.html#start_link/1"},{"type":"function","title":"Lightning.Repo.stop/1","doc":"","ref":"Lightning.Repo.html#stop/1"},{"type":"function","title":"Lightning.Repo.stream/2","doc":"","ref":"Lightning.Repo.html#stream/2"},{"type":"function","title":"Lightning.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Lightning.Repo.html#to_sql/2"},{"type":"function","title":"Lightning.Repo.transact/2","doc":"A small wrapper around `Repo.transaction/2`.\n\nCommits the transaction if the lambda returns `:ok` or `{:ok, result}`,\nrolling it back if the lambda returns `:error` or `{:error, reason}`. In both\ncases, the function returns the result of the lambda.\n\nExample:\n\n Repo.transact(fn ->\n with {:ok, user} <- Accounts.create_user(params),\n {:ok, _log} <- Logs.log_action(:user_registered, user),\n {:ok, _job} <- Mailer.enqueue_email_confirmation(user) do\n {:ok, user}\n end\n end)\n\nFrom blog post found [here](https://tomkonidas.com/repo-transact/)","ref":"Lightning.Repo.html#transact/2"},{"type":"function","title":"Lightning.Repo.transaction/2","doc":"","ref":"Lightning.Repo.html#transaction/2"},{"type":"function","title":"Lightning.Repo.update/2","doc":"","ref":"Lightning.Repo.html#update/2"},{"type":"function","title":"Lightning.Repo.update!/2","doc":"","ref":"Lightning.Repo.html#update!/2"},{"type":"function","title":"Lightning.Repo.update_all/3","doc":"","ref":"Lightning.Repo.html#update_all/3"},{"type":"module","title":"Lightning.Run","doc":"Ecto model for Runs.","ref":"Lightning.Run.html"},{"type":"function","title":"Lightning.Run.add_options/2","doc":"Adds options (project-level logging options, resource limits such as timeout\nand memory usage, etc.) to the run before storing in the DB.","ref":"Lightning.Run.html#add_options/2"},{"type":"function","title":"Lightning.Run.complete/2","doc":"","ref":"Lightning.Run.html#complete/2"},{"type":"macro","title":"Lightning.Run.final_states/0","doc":"Returns the list of final states for a run.","ref":"Lightning.Run.html#final_states/0"},{"type":"function","title":"Lightning.Run.for/2","doc":"","ref":"Lightning.Run.html#for/2"},{"type":"function","title":"Lightning.Run.new/1","doc":"","ref":"Lightning.Run.html#new/1"},{"type":"function","title":"Lightning.Run.start/2","doc":"","ref":"Lightning.Run.html#start/2"},{"type":"type","title":"Lightning.Run.t/0","doc":"","ref":"Lightning.Run.html#t:t/0"},{"type":"module","title":"Lightning.RunStep","doc":"Ecto model for an the Steps in a Run.","ref":"Lightning.RunStep.html"},{"type":"function","title":"Lightning.RunStep.new/1","doc":"","ref":"Lightning.RunStep.html#new/1"},{"type":"function","title":"Lightning.RunStep.new/2","doc":"","ref":"Lightning.RunStep.html#new/2"},{"type":"type","title":"Lightning.RunStep.t/0","doc":"","ref":"Lightning.RunStep.html#t:t/0"},{"type":"module","title":"Lightning.SafetyString","doc":"Utilities for securely encoding serializable structs, lists and strings into\nURL-safe strings.\n\nIn order to pass the state around in a URL, in a manner that protects\nsecrets from leaking - and allows us to avoid persistance\nwe take a set of parameters and:\n\n- Encode into a URI query string\n- gzip it to save characters\n- encrypt the string\n- base64 encode it for URI encoding safety","ref":"Lightning.SafetyString.html"},{"type":"function","title":"Lightning.SafetyString.decode/1","doc":"","ref":"Lightning.SafetyString.html#decode/1"},{"type":"function","title":"Lightning.SafetyString.encode/1","doc":"","ref":"Lightning.SafetyString.html#encode/1"},{"type":"module","title":"Lightning.Schema","doc":"Defines the database schema and primary key type for Thunderbolt schemas.","ref":"Lightning.Schema.html"},{"type":"module","title":"Lightning.Scrubber","doc":"Process used to scrub strings of sensitive information.\n\nCan be started via `start_link/1`.\n\n```\n{:ok, scrubber} =\n Lightning.Scrubber.start_link(\n samples:\n Lightning.Credentials.sensitive_values_for(credential)\n )\n```\n\nTakes an optional `:name` key, in case you need to name the process.","ref":"Lightning.Scrubber.html"},{"type":"function","title":"Lightning.Scrubber.add_samples/3","doc":"","ref":"Lightning.Scrubber.html#add_samples/3"},{"type":"function","title":"Lightning.Scrubber.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Scrubber.html#child_spec/1"},{"type":"function","title":"Lightning.Scrubber.encode_samples/2","doc":"Prepare a list of sensitive samples (strings) into a potentially bigger list\ncomposed of variations a sample may appear.","ref":"Lightning.Scrubber.html#encode_samples/2"},{"type":"function","title":"Lightning.Scrubber.samples/1","doc":"","ref":"Lightning.Scrubber.html#samples/1"},{"type":"function","title":"Lightning.Scrubber.scrub/2","doc":"","ref":"Lightning.Scrubber.html#scrub/2"},{"type":"function","title":"Lightning.Scrubber.start_link/1","doc":"","ref":"Lightning.Scrubber.html#start_link/1"},{"type":"module","title":"Lightning.Services.AccountHook","doc":"Allows handling user creation or registration atomically without relying on async events.","ref":"Lightning.Services.AccountHook.html"},{"type":"function","title":"Lightning.Services.AccountHook.handle_create_user/1","doc":"","ref":"Lightning.Services.AccountHook.html#handle_create_user/1"},{"type":"function","title":"Lightning.Services.AccountHook.handle_register_superuser/1","doc":"","ref":"Lightning.Services.AccountHook.html#handle_register_superuser/1"},{"type":"function","title":"Lightning.Services.AccountHook.handle_register_user/1","doc":"","ref":"Lightning.Services.AccountHook.html#handle_register_user/1"},{"type":"module","title":"Lightning.Services.AdapterHelper","doc":"Maps the module to be used for the extension service.","ref":"Lightning.Services.AdapterHelper.html"},{"type":"function","title":"Lightning.Services.AdapterHelper.adapter/1","doc":"","ref":"Lightning.Services.AdapterHelper.html#adapter/1"},{"type":"module","title":"Lightning.Services.ProjectHook","doc":"Allows handling project creation atomically without relying on async events.","ref":"Lightning.Services.ProjectHook.html"},{"type":"function","title":"Lightning.Services.ProjectHook.handle_create_project/1","doc":"","ref":"Lightning.Services.ProjectHook.html#handle_create_project/1"},{"type":"function","title":"Lightning.Services.ProjectHook.handle_delete_project/1","doc":"","ref":"Lightning.Services.ProjectHook.html#handle_delete_project/1"},{"type":"module","title":"Lightning.Services.RateLimiter","doc":"Adapter to call the extension for rate limiting.","ref":"Lightning.Services.RateLimiter.html"},{"type":"module","title":"Lightning.Services.RunQueue","doc":"Adapter to call the extension for selecting Runtime workloads.","ref":"Lightning.Services.RunQueue.html"},{"type":"module","title":"Lightning.Services.UsageLimiter","doc":"Adapter to call the extension for limiting Runtime workloads.","ref":"Lightning.Services.UsageLimiter.html"},{"type":"module","title":"Lightning.Setup","doc":"Demo encapsulates logic for setting up a demonstration site.","ref":"Lightning.Setup.html"},{"type":"function","title":"Lightning.Setup.ensure_minimum_setup/0","doc":"Set up the bare minimum so that commands can be executed against the repo.","ref":"Lightning.Setup.html#ensure_minimum_setup/0"},{"type":"function","title":"Lightning.Setup.setup_user/3","doc":"This makes it possible to run setup_user as an external command\n\nSee: Lightning.SetupUtils.setup_user() for more docs.","ref":"Lightning.Setup.html#setup_user/3"},{"type":"function","title":"Examples - Lightning.Setup.setup_user/3","doc":"iex> kubectl exec -it deploy/demo-web -- /app/bin/lightning eval Lightning.Setup.setup_user(%{email: \"td@openfn.org\", first_name: \"taylor\", last_name: \"downs\", password: \"shh12345!\"})\n :ok","ref":"Lightning.Setup.html#setup_user/3-examples"},{"type":"module","title":"Lightning.SetupUtils","doc":"SetupUtils encapsulates logic for setting up initial data for various sites.","ref":"Lightning.SetupUtils.html"},{"type":"function","title":"Lightning.SetupUtils.confirm_users/1","doc":"","ref":"Lightning.SetupUtils.html#confirm_users/1"},{"type":"function","title":"Lightning.SetupUtils.create_dhis2_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_dhis2_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_openhie_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_openhie_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_starter_project/2","doc":"","ref":"Lightning.SetupUtils.html#create_starter_project/2"},{"type":"function","title":"Lightning.SetupUtils.create_users/1","doc":"","ref":"Lightning.SetupUtils.html#create_users/1"},{"type":"function","title":"Lightning.SetupUtils.setup_demo/1","doc":"Creates initial data and returns the created records.","ref":"Lightning.SetupUtils.html#setup_demo/1"},{"type":"function","title":"Lightning.SetupUtils.setup_user/3","doc":"In some (mostly remote-controlled) deployments, it's necessary to create a\nuser, and apiToken, and multiple credentials (owned by the user) so that later\n`openfn deploy` calls can make use of these artifacts.\n\nWhen run _before_ `openfn deploy`, this function makes it possible to set up\nan entire lightning instance with a working project (including secrets)\nwithout using the web UI.","ref":"Lightning.SetupUtils.html#setup_user/3"},{"type":"function","title":"Examples - Lightning.SetupUtils.setup_user/3","doc":"iex> setup_user(%{email: \"td@openfn.org\", first_name: \"taylor\", last_name: \"downs\", password: \"shh12345!\"}, \"secretToken\", [%{name: \"openmrs\", schema: \"raw\", body: %{\"a\" => \"secret\"}}, %{ name: \"dhis2\", schema: \"raw\", body: %{\"b\" => \"safe\"}}])\n :ok","ref":"Lightning.SetupUtils.html#setup_user/3-examples"},{"type":"function","title":"Lightning.SetupUtils.tear_down/1","doc":"","ref":"Lightning.SetupUtils.html#tear_down/1"},{"type":"module","title":"Lightning.SetupUtils.Ticker","doc":"Time ticker to assure time progress/sequence specially for multiple logs.","ref":"Lightning.SetupUtils.Ticker.html"},{"type":"function","title":"Lightning.SetupUtils.Ticker.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.SetupUtils.Ticker.html#child_spec/1"},{"type":"function","title":"Lightning.SetupUtils.Ticker.next/1","doc":"","ref":"Lightning.SetupUtils.Ticker.html#next/1"},{"type":"function","title":"Lightning.SetupUtils.Ticker.start_link/1","doc":"","ref":"Lightning.SetupUtils.Ticker.html#start_link/1"},{"type":"function","title":"Lightning.SetupUtils.Ticker.stop/1","doc":"","ref":"Lightning.SetupUtils.Ticker.html#stop/1"},{"type":"module","title":"Lightning.Storage","doc":"The external storage module.\n\nThis module is responsible for storing and retrieving files from the\nconfigured storage backend.","ref":"Lightning.Storage.html"},{"type":"behaviour","title":"Lightning.Storage.Backend","doc":"The behaviour for storage backends.","ref":"Lightning.Storage.Backend.html"},{"type":"callback","title":"Lightning.Storage.Backend.get_url/1","doc":"","ref":"Lightning.Storage.Backend.html#c:get_url/1"},{"type":"callback","title":"Lightning.Storage.Backend.store/2","doc":"","ref":"Lightning.Storage.Backend.html#c:store/2"},{"type":"module","title":"Lightning.Storage.GCS","doc":"A storage backend module for handling file storage in Google Cloud Storage (GCS).\n\nIt implements the `Lightning.Storage.Backend` behaviour to manage file storage operations in Google Cloud Storage. This includes storing files to GCS buckets and generating signed URLs for secure access to the stored files.","ref":"Lightning.Storage.GCS.html"},{"type":"module","title":"Responsibilities - Lightning.Storage.GCS","doc":"- **Storing Files**: The `store/2` function uploads files from a local source path to a specified destination path within a GCS bucket.\n- **Generating Signed URLs**: The `get_url/1` function generates a signed URL for accessing a file stored in GCS. This signed URL is valid for a limited time (default 1 hour).\n- **Configuration**: The module relies on application configuration to determine the GCS bucket and Google API connection settings.","ref":"Lightning.Storage.GCS.html#module-responsibilities"},{"type":"module","title":"Example Usage - Lightning.Storage.GCS","doc":"```elixir\n# Store a file in GCS\nLightning.Storage.GCS.store(\"/path/to/source\", \"destination/path\")\n\n# Get a signed URL for the stored file\n{:ok, url} = Lightning.Storage.GCS.get_url(\"destination/path\")\n```","ref":"Lightning.Storage.GCS.html#module-example-usage"},{"type":"module","title":"Lightning.Storage.Local","doc":"A storage backend module for handling local file storage.\n\nIt implements the `Lightning.Storage.Backend` behaviour to manage file storage\noperations on the local file system. This includes storing files from a source\npath to a destination path and generating URLs for accessing stored files.","ref":"Lightning.Storage.Local.html"},{"type":"module","title":"Responsibilities - Lightning.Storage.Local","doc":"- **Storing Files**: The `store/2` function is responsible for copying files\n from a given source path to a specified destination path on the local file\n system.\n- **Generating URLs**: The `get_url/1` function generates a `file://` URL for\n accessing a stored file locally.\n- **Configuration**: The module relies on application configuration to\n determine the root directory for storage operations.","ref":"Lightning.Storage.Local.html#module-responsibilities"},{"type":"module","title":"Example Usage - Lightning.Storage.Local","doc":"```elixir\n# Store a file\n{:ok, filename} =\n Lightning.Storage.Local.store(\"/path/to/source\", \"destination/path\")\n\n# Get the URL for the stored file\n{:ok, url} = Lightning.Storage.Local.get_url(\"destination/path\")\n```","ref":"Lightning.Storage.Local.html#module-example-usage"},{"type":"module","title":"Lightning.Storage.ProjectFileDefinition","doc":"This module provides functionality for managing the storage and retrieval of project files.\n\n It handles operations related to storing project files, generating URLs for accessing these files, and constructing storage paths for exported files. It serves as an abstraction layer over the underlying storage mechanism provided by the `Lightning.Storage` module.","ref":"Lightning.Storage.ProjectFileDefinition.html"},{"type":"module","title":"Functions - Lightning.Storage.ProjectFileDefinition","doc":"- `store/2`: Stores a file from a given source path into the storage system based on the file's path.\n - `get_url/1`: Retrieves the URL for accessing a stored file.\n - `storage_path_for_exports/2`: Constructs a storage path for exported files, defaulting to a `.zip` extension.","ref":"Lightning.Storage.ProjectFileDefinition.html#module-functions"},{"type":"module","title":"Example Usage - Lightning.Storage.ProjectFileDefinition","doc":"```elixir\n # Store a file\n Lightning.Storage.ProjectFileDefinition.store(\"/path/to/source\", project_file)\n\n # Get a URL for the stored file\n url = Lightning.Storage.ProjectFileDefinition.get_url(project_file)\n\n # Get the storage path for an exported file\n path = Lightning.Storage.ProjectFileDefinition.storage_path_for_exports(project_file)\n ```","ref":"Lightning.Storage.ProjectFileDefinition.html#module-example-usage"},{"type":"function","title":"Lightning.Storage.ProjectFileDefinition.get_url/1","doc":"","ref":"Lightning.Storage.ProjectFileDefinition.html#get_url/1"},{"type":"function","title":"Lightning.Storage.ProjectFileDefinition.storage_path_for_exports/2","doc":"","ref":"Lightning.Storage.ProjectFileDefinition.html#storage_path_for_exports/2"},{"type":"function","title":"Lightning.Storage.ProjectFileDefinition.store/2","doc":"","ref":"Lightning.Storage.ProjectFileDefinition.html#store/2"},{"type":"module","title":"Lightning.TaskWorker","doc":"A TaskWorker with concurrency limits.\n\nA simple concurrency limiter that wraps `Task.Supervisor`, which already does\nhave the ability to specify `max_children`; it throws an error when\nthat limit is exceeded.\n\nTo use it, start it like any other process; ideally in your supervision tree.\n\n```\n ...,\n {Lightning.TaskWorker, name: :cli_task_worker, max_tasks: 4}\n```\n\n**Options**\n\n- `:max_tasks` Defaults to the number of system schedulers available to the vm.","ref":"Lightning.TaskWorker.html"},{"type":"function","title":"Lightning.TaskWorker.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.TaskWorker.html#child_spec/1"},{"type":"function","title":"Lightning.TaskWorker.get_status/1","doc":"","ref":"Lightning.TaskWorker.html#get_status/1"},{"type":"function","title":"Lightning.TaskWorker.start_link/1","doc":"","ref":"Lightning.TaskWorker.html#start_link/1"},{"type":"function","title":"Lightning.TaskWorker.start_task/2","doc":"","ref":"Lightning.TaskWorker.html#start_task/2"},{"type":"module","title":"Lightning.UsageTracking","doc":"The UsageTracking context.","ref":"Lightning.UsageTracking.html"},{"type":"function","title":"Lightning.UsageTracking.disable_daily_report/0","doc":"","ref":"Lightning.UsageTracking.html#disable_daily_report/0"},{"type":"function","title":"Lightning.UsageTracking.enable_daily_report/1","doc":"","ref":"Lightning.UsageTracking.html#enable_daily_report/1"},{"type":"function","title":"Lightning.UsageTracking.enqueue_reports/3","doc":"","ref":"Lightning.UsageTracking.html#enqueue_reports/3"},{"type":"function","title":"Lightning.UsageTracking.find_enabled_daily_report_config/0","doc":"","ref":"Lightning.UsageTracking.html#find_enabled_daily_report_config/0"},{"type":"function","title":"Lightning.UsageTracking.insert_report/3","doc":"","ref":"Lightning.UsageTracking.html#insert_report/3"},{"type":"function","title":"Lightning.UsageTracking.lightning_version/0","doc":"","ref":"Lightning.UsageTracking.html#lightning_version/0"},{"type":"function","title":"Lightning.UsageTracking.reportable_dates/3","doc":"","ref":"Lightning.UsageTracking.html#reportable_dates/3"},{"type":"function","title":"Lightning.UsageTracking.start_reporting_after/1","doc":"","ref":"Lightning.UsageTracking.html#start_reporting_after/1"},{"type":"function","title":"Lightning.UsageTracking.submit_report/2","doc":"","ref":"Lightning.UsageTracking.html#submit_report/2"},{"type":"function","title":"Lightning.UsageTracking.update_report_submission!/2","doc":"","ref":"Lightning.UsageTracking.html#update_report_submission!/2"},{"type":"module","title":"Lightning.UsageTracking.Client","doc":"Client for Usage Tracker service","ref":"Lightning.UsageTracking.Client.html"},{"type":"function","title":"Lightning.UsageTracking.Client.reachable?/1","doc":"","ref":"Lightning.UsageTracking.Client.html#reachable?/1"},{"type":"function","title":"Lightning.UsageTracking.Client.submit_metrics/2","doc":"","ref":"Lightning.UsageTracking.Client.html#submit_metrics/2"},{"type":"module","title":"Lightning.UsageTracking.DailyReportConfiguration","doc":"Configuration for the creation of daily reports","ref":"Lightning.UsageTracking.DailyReportConfiguration.html"},{"type":"function","title":"Lightning.UsageTracking.DailyReportConfiguration.changeset/2","doc":"","ref":"Lightning.UsageTracking.DailyReportConfiguration.html#changeset/2"},{"type":"module","title":"Lightning.UsageTracking.DayWorker","doc":"Worker to manage per-day report generation","ref":"Lightning.UsageTracking.DayWorker.html"},{"type":"module","title":"Lightning.UsageTracking.GithubClient","doc":"A github client to make unauthenticated HTTP requests to Github.","ref":"Lightning.UsageTracking.GithubClient.html"},{"type":"function","title":"Lightning.UsageTracking.GithubClient.build_client/1","doc":"","ref":"Lightning.UsageTracking.GithubClient.html#build_client/1"},{"type":"function","title":"Lightning.UsageTracking.GithubClient.open_fn_commit?/1","doc":"","ref":"Lightning.UsageTracking.GithubClient.html#open_fn_commit?/1"},{"type":"module","title":"Lightning.UsageTracking.ProjectMetricsService","doc":"Builds project-related metrics.","ref":"Lightning.UsageTracking.ProjectMetricsService.html"},{"type":"function","title":"Lightning.UsageTracking.ProjectMetricsService.find_eligible_projects/1","doc":"","ref":"Lightning.UsageTracking.ProjectMetricsService.html#find_eligible_projects/1"},{"type":"function","title":"Lightning.UsageTracking.ProjectMetricsService.generate_metrics/3","doc":"","ref":"Lightning.UsageTracking.ProjectMetricsService.html#generate_metrics/3"},{"type":"module","title":"Lightning.UsageTracking.Report","doc":"Report submitted to Usage Tracker","ref":"Lightning.UsageTracking.Report.html"},{"type":"function","title":"Lightning.UsageTracking.Report.changeset/2","doc":"","ref":"Lightning.UsageTracking.Report.html#changeset/2"},{"type":"module","title":"Lightning.UsageTracking.ReportData","doc":"Builds data set for submission to Usage Tracker","ref":"Lightning.UsageTracking.ReportData.html"},{"type":"function","title":"Lightning.UsageTracking.ReportData.generate/3","doc":"","ref":"Lightning.UsageTracking.ReportData.html#generate/3"},{"type":"module","title":"Lightning.UsageTracking.ReportWorker","doc":"Worker to generate report for given day","ref":"Lightning.UsageTracking.ReportWorker.html"},{"type":"module","title":"Lightning.UsageTracking.ResponseProcessor","doc":"Utility module to abstract dealing with some of the Tesla plumbing","ref":"Lightning.UsageTracking.ResponseProcessor.html"},{"type":"function","title":"Lightning.UsageTracking.ResponseProcessor.successful?/1","doc":"","ref":"Lightning.UsageTracking.ResponseProcessor.html#successful?/1"},{"type":"function","title":"Lightning.UsageTracking.ResponseProcessor.successful_200?/1","doc":"","ref":"Lightning.UsageTracking.ResponseProcessor.html#successful_200?/1"},{"type":"module","title":"Lightning.UsageTracking.ResubmissionCandidatesWorker","doc":"Worker to find reports that have failed submissions and enqueue jobs to\nreprocess them.","ref":"Lightning.UsageTracking.ResubmissionCandidatesWorker.html"},{"type":"module","title":"Lightning.UsageTracking.ResubmissionWorker","doc":"Worker to resubmit report that has failed submission.","ref":"Lightning.UsageTracking.ResubmissionWorker.html"},{"type":"module","title":"Lightning.UsageTracking.RunService","doc":"Supports the generation of metrics related to runs and steps.","ref":"Lightning.UsageTracking.RunService.html"},{"type":"function","title":"Lightning.UsageTracking.RunService.finished_runs/2","doc":"","ref":"Lightning.UsageTracking.RunService.html#finished_runs/2"},{"type":"function","title":"Lightning.UsageTracking.RunService.finished_steps/2","doc":"","ref":"Lightning.UsageTracking.RunService.html#finished_steps/2"},{"type":"function","title":"Lightning.UsageTracking.RunService.unique_job_ids/2","doc":"","ref":"Lightning.UsageTracking.RunService.html#unique_job_ids/2"},{"type":"module","title":"Lightning.UsageTracking.UserQueries","doc":"Contains queries used to determine user-related metrics.","ref":"Lightning.UsageTracking.UserQueries.html"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.active_users/1","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#active_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.active_users/2","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#active_users/2"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.existing_users/1","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#existing_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.existing_users/2","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#existing_users/2"},{"type":"module","title":"Lightning.UsageTracking.UserService","doc":"Returns counts for the various user-related metrics.","ref":"Lightning.UsageTracking.UserService.html"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_active_users/1","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_active_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_active_users/2","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_active_users/2"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_users/1","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_users/2","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_users/2"},{"type":"module","title":"Lightning.UsageTracking.WorkflowMetricsService","doc":"Builds workflow-related metrics.","ref":"Lightning.UsageTracking.WorkflowMetricsService.html"},{"type":"function","title":"Lightning.UsageTracking.WorkflowMetricsService.find_eligible_workflows/2","doc":"","ref":"Lightning.UsageTracking.WorkflowMetricsService.html#find_eligible_workflows/2"},{"type":"function","title":"Lightning.UsageTracking.WorkflowMetricsService.generate_metrics/3","doc":"","ref":"Lightning.UsageTracking.WorkflowMetricsService.html#generate_metrics/3"},{"type":"module","title":"Lightning.Validators","doc":"Extra validators for Ecto.Changeset.","ref":"Lightning.Validators.html"},{"type":"function","title":"Lightning.Validators.validate_exclusive/3","doc":"Validate that only one of the fields is set at a time.\n\nExample:\n\n```\nchangeset\n|> validate_exclusive(\n [:source_job_id, :source_trigger_id],\n \"source_job_id and source_trigger_id are mutually exclusive\"\n)\n```","ref":"Lightning.Validators.html#validate_exclusive/3"},{"type":"function","title":"Lightning.Validators.validate_one_required/3","doc":"Validate that at least one of the fields is set.","ref":"Lightning.Validators.html#validate_one_required/3"},{"type":"function","title":"Lightning.Validators.validate_required_assoc/3","doc":"Validate that an association is present\n\n> **NOTE**\n> This should only be used when using `put_assoc`, not `cast_assoc`.\n> `cast_assoc` provides a `required: true` option.\n> Unlike `validate_required`, this does not add the field to the `required`\n> list in the schema.","ref":"Lightning.Validators.html#validate_required_assoc/3"},{"type":"function","title":"Lightning.Validators.validate_url/2","doc":"Validate that a field is a valid URL.","ref":"Lightning.Validators.html#validate_url/2"},{"type":"module","title":"Lightning.Vault","doc":"Module for handling the encryption and decryption of database fields.","ref":"Lightning.Vault.html"},{"type":"function","title":"Lightning.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Vault.html#child_spec/1"},{"type":"function","title":"Lightning.Vault.start_link/1","doc":"","ref":"Lightning.Vault.html#start_link/1"},{"type":"module","title":"Lightning.VersionControl","doc":"Boundary module for handling Version control activities for project, jobs\nworkflows etc\nUse this module to create, modify and delete connections as well\nas running any associated sync jobs","ref":"Lightning.VersionControl.html"},{"type":"function","title":"Lightning.VersionControl.create_github_connection/2","doc":"Creates a connection between a project and a github repo","ref":"Lightning.VersionControl.html#create_github_connection/2"},{"type":"function","title":"Lightning.VersionControl.delete_github_oauth_grant/1","doc":"Deletes the authorization for the github app and updates the user details accordingly","ref":"Lightning.VersionControl.html#delete_github_oauth_grant/1"},{"type":"function","title":"Lightning.VersionControl.exchange_code_for_oauth_token/1","doc":"Fetches the oauth access token using the code received from the callback url\nFor more info: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-user-access-token-for-a-github-app","ref":"Lightning.VersionControl.html#exchange_code_for_oauth_token/1"},{"type":"function","title":"Lightning.VersionControl.fetch_installation_repos/1","doc":"","ref":"Lightning.VersionControl.html#fetch_installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.fetch_repo_branches/2","doc":"","ref":"Lightning.VersionControl.html#fetch_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.fetch_user_access_token/1","doc":"Fecthes the access token for the given `User`.\nIf the access token has expired, it `refreshes` the token and updates the `User` column accordingly","ref":"Lightning.VersionControl.html#fetch_user_access_token/1"},{"type":"function","title":"Lightning.VersionControl.fetch_user_installations/1","doc":"","ref":"Lightning.VersionControl.html#fetch_user_installations/1"},{"type":"function","title":"Lightning.VersionControl.get_repo_connection_for_project/1","doc":"","ref":"Lightning.VersionControl.html#get_repo_connection_for_project/1"},{"type":"function","title":"Lightning.VersionControl.get_repo_connection_for_token/1","doc":"","ref":"Lightning.VersionControl.html#get_repo_connection_for_token/1"},{"type":"function","title":"Lightning.VersionControl.github_enabled?/0","doc":"","ref":"Lightning.VersionControl.html#github_enabled?/0"},{"type":"function","title":"Lightning.VersionControl.initiate_sync/2","doc":"","ref":"Lightning.VersionControl.html#initiate_sync/2"},{"type":"function","title":"Lightning.VersionControl.oauth_token_valid?/1","doc":"Checks if the given token has expired.\nGithub supports access tokens that expire and those that don't.\nIf the `access token` expires, then a `refresh token` is also availed.\nThis function simply checks if the token has a `refresh_token`, if yes, it proceeds to check the expiry date","ref":"Lightning.VersionControl.html#oauth_token_valid?/1"},{"type":"function","title":"Lightning.VersionControl.reconfigure_github_connection/3","doc":"","ref":"Lightning.VersionControl.html#reconfigure_github_connection/3"},{"type":"function","title":"Lightning.VersionControl.refresh_oauth_token/1","doc":"Fetches a new access token using the given refresh token\nFor more info: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/refreshing-user-access-tokens","ref":"Lightning.VersionControl.html#refresh_oauth_token/1"},{"type":"function","title":"Lightning.VersionControl.remove_github_connection/2","doc":"Deletes a github connection","ref":"Lightning.VersionControl.html#remove_github_connection/2"},{"type":"function","title":"Lightning.VersionControl.save_oauth_token/3","doc":"","ref":"Lightning.VersionControl.html#save_oauth_token/3"},{"type":"function","title":"Lightning.VersionControl.subscribe/1","doc":"","ref":"Lightning.VersionControl.html#subscribe/1"},{"type":"function","title":"Lightning.VersionControl.verify_github_connection/1","doc":"","ref":"Lightning.VersionControl.html#verify_github_connection/1"},{"type":"module","title":"Lightning.VersionControl.Events","doc":"","ref":"Lightning.VersionControl.Events.html"},{"type":"function","title":"Lightning.VersionControl.Events.oauth_token_added/1","doc":"","ref":"Lightning.VersionControl.Events.html#oauth_token_added/1"},{"type":"function","title":"Lightning.VersionControl.Events.oauth_token_failed/2","doc":"","ref":"Lightning.VersionControl.Events.html#oauth_token_failed/2"},{"type":"function","title":"Lightning.VersionControl.Events.subscribe/1","doc":"","ref":"Lightning.VersionControl.Events.html#subscribe/1"},{"type":"module","title":"Lightning.VersionControl.GithubClient","doc":"Tesla github http client we use this to make any network requests\nto github from Lightning","ref":"Lightning.VersionControl.GithubClient.html"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_basic_auth_client/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_basic_auth_client/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_bearer_client/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_bearer_client/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_installation_client/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_installation_client/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_oauth_client/0","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_oauth_client/0"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_blob/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_blob/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_commit/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_commit/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_ref/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_ref/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_repo_dispatch_event/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_repo_dispatch_event/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_repo_secret/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_repo_secret/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_tree/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_tree/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_workflow_dispatch_event/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_workflow_dispatch_event/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete/3","doc":"Perform a DELETE request.\n\nSee `request/1` or `request/2` for options definition.\n\n delete(\"/users\")\n delete(\"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\")\n delete(client, \"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#delete/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete!/3","doc":"Perform a DELETE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n delete!(\"/users\")\n delete!(\"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\")\n delete!(client, \"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#delete!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_app_grant/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_app_grant/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_ref/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_ref/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_repo_content/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_repo_content/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_repo_secret/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_repo_secret/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#get/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#get!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_commit/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_commit/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_installation_repos/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_installations/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_installations/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_branches/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_content/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_content/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_public_key/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_public_key/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_secret/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_secret/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#head/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#head!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#options/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#options!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#patch/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#patch!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post/4","doc":"Perform a POST request.\n\nSee `request/1` or `request/2` for options definition.\n\n post(\"/users\", %{name: \"Jon\"})\n post(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post(client, \"/users\", %{name: \"Jon\"})\n post(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#post/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post!/4","doc":"Perform a POST request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n post!(\"/users\", %{name: \"Jon\"})\n post!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post!(client, \"/users\", %{name: \"Jon\"})\n post!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#post!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put/4","doc":"Perform a PUT request.\n\nSee `request/1` or `request/2` for options definition.\n\n put(\"/users\", %{name: \"Jon\"})\n put(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put(client, \"/users\", %{name: \"Jon\"})\n put(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#put/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put!/4","doc":"Perform a PUT request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n put!(\"/users\", %{name: \"Jon\"})\n put!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put!(client, \"/users\", %{name: \"Jon\"})\n put!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#put!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request/2","doc":"Perform a request.","ref":"Lightning.VersionControl.GithubClient.html#request/2"},{"type":"function","title":"Options - Lightning.VersionControl.GithubClient.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"Lightning.VersionControl.GithubClient.html#request/2-options"},{"type":"function","title":"Examples - Lightning.VersionControl.GithubClient.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#request/2-examples"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"Lightning.VersionControl.GithubClient.html#request!/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#trace/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#trace!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.update_ref/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#update_ref/4"},{"type":"type","title":"Lightning.VersionControl.GithubClient.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"Lightning.VersionControl.GithubClient.html#t:option/0"},{"type":"exception","title":"Lightning.VersionControl.GithubError","doc":"GitHub Error exception","ref":"Lightning.VersionControl.GithubError.html"},{"type":"function","title":"Lightning.VersionControl.GithubError.api_error/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#api_error/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.file_not_found/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#file_not_found/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.installation_not_found/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#installation_not_found/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.invalid_certificate/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#invalid_certificate/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.invalid_oauth_token/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#invalid_oauth_token/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.misconfigured/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#misconfigured/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.new/3","doc":"","ref":"Lightning.VersionControl.GithubError.html#new/3"},{"type":"function","title":"Lightning.VersionControl.GithubError.repo_secret_not_found/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#repo_secret_not_found/2"},{"type":"type","title":"Lightning.VersionControl.GithubError.t/0","doc":"","ref":"Lightning.VersionControl.GithubError.html#t:t/0"},{"type":"module","title":"Lightning.VersionControl.GithubToken","doc":"A module that `uses` Joken to handle building and signing application\ntokens for communicating with github\n\nSee: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app#about-json-web-tokens-jwts","ref":"Lightning.VersionControl.GithubToken.html"},{"type":"function","title":"Lightning.VersionControl.GithubToken.build/2","doc":"","ref":"Lightning.VersionControl.GithubToken.html#build/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate!/3"},{"type":"module","title":"Lightning.VersionControl.ProjectRepoConnection","doc":"Ecto model for project repo connections","ref":"Lightning.VersionControl.ProjectRepoConnection.html"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#changeset/2"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.config_path/1","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#config_path/1"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.configure_changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#configure_changeset/2"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.create_changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#create_changeset/2"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.reconfigure_changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#reconfigure_changeset/2"},{"type":"type","title":"Lightning.VersionControl.ProjectRepoConnection.t/0","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#t:t/0"},{"type":"module","title":"Lightning.WebhookAuthMethods","doc":"Provides functionality for managing webhook authentication methods.\n\nThis module contains functions to create, update, list, and delete authentication methods\nfor webhooks. It supports operations such as scheduling authentication methods for deletion,\npurging them, associating them with triggers, and handling their life cycle within the system.\n\nThe main responsibilities of this module include:\n\n- Creating new webhook authentication methods with `create_auth_method/2`.\n- Associating and disassociating authentication methods with triggers.\n- Updating existing webhook authentication methods with `update_auth_method/3`.\n- Listing webhook authentication methods for a given project or trigger.\n- Finding a webhook authentication method by various identifiers, like API key or username and password.\n- Scheduling webhook authentication methods for deletion and purging them accordingly.","ref":"Lightning.WebhookAuthMethods.html"},{"type":"function","title":"Lightning.WebhookAuthMethods.create_auth_method/2","doc":"Creates a new `WebhookAuthMethod` and associated audit records.\n\nThis function supports creating a `WebhookAuthMethod` either standalone or associated with a `Trigger`. It performs a database transaction that includes creating the auth method and its audit trail.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- `attrs`: A map of attributes used to create the `WebhookAuthMethod`.\n - `actor`: The user performing the action, provided as a `%User{}` struct.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-parameters"},{"type":"function","title":"Overloads - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- When called with a map of attributes, it creates a `WebhookAuthMethod` without associating it to a trigger.\n - When called with a `Trigger` struct and a map of attributes, it creates a `WebhookAuthMethod` and associates it with the provided trigger.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-overloads"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- `{:ok, %WebhookAuthMethod{}}`: A tuple containing `:ok` and the newly created `WebhookAuthMethod` struct if the creation was successful.\n - `{:error, %Ecto.Changeset{}}`: A tuple containing `:error` and the changeset with errors if the creation failed.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- Creating a `WebhookAuthMethod` without an associated trigger:\n\n ```elixir\n iex> create_auth_method(%{valid_attributes}, actor: %User{})\n {:ok, %WebhookAuthMethod{}}\n\n iex> create_auth_method(%{invalid_attributes}, actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```\n\n - Creating a `WebhookAuthMethod` with an associated trigger:\n\n ```elixir\n iex> create_auth_method(%Trigger{}, %{valid_attributes}, actor: %User{})\n {:ok, %WebhookAuthMethod{}}\n\n iex> create_auth_method(%Trigger{}, %{invalid_attributes}, actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- This function starts a `Repo.transaction` to ensure that all database operations are atomic. If any part of the transaction fails, all changes will be rolled back.\n - Audit events are created for both the creation of the `WebhookAuthMethod` and its association with a trigger, if applicable.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-notes"},{"type":"function","title":"Lightning.WebhookAuthMethods.create_auth_method/3","doc":"","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/3"},{"type":"function","title":"Lightning.WebhookAuthMethods.create_changeset/2","doc":"Creates a changeset for a `WebhookAuthMethod` struct, which can include special handling based on the authentication type.\n\nThis function prepares a changeset for the creation or update of a `WebhookAuthMethod`. If the `auth_type` is `:api`, it generates a new API key and includes it in the returned structure.","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.create_changeset/2","doc":"- `webhook_auth_method`: The `WebhookAuthMethod` struct to be updated.\n - `params`: A map containing the parameters with which to update the `webhook_auth_method`.","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.create_changeset/2","doc":"- Returns the updated `WebhookAuthMethod` struct with changes applied. If `auth_type` is `:api`, an API key is generated and included.","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.create_changeset/2","doc":"- Creating a changeset for an API type auth method:\n\n ```elixir\n iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :api}, %{})\n %WebhookAuthMethod{api_key: some_new_api_key}\n ```\n\n - Creating a changeset for a non-API type auth method:\n\n ```elixir\n iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :other}, %{})\n %WebhookAuthMethod{}\n ```","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"Deletes a given `WebhookAuthMethod` from the database.\n\nThe function takes a `WebhookAuthMethod` struct and runs to delete it. If the deletion is successful, it returns an `:ok` tuple with the deleted `WebhookAuthMethod` struct. If the deletion fails due to a constraint, such as a foreign key reference, it returns an error tuple.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- `auth_method`: The `WebhookAuthMethod` struct to delete.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- `{:ok, struct}`: A tuple containing `:ok` and the deleted `WebhookAuthMethod` struct if the deletion succeeds.\n - `{:error, reason}`: A tuple containing `:error` and the reason for failure if the deletion fails.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- Successful deletion:\n\n ```elixir\n iex> delete_auth_method(%WebhookAuthMethod{id: \"some_id\"})\n {:ok, %WebhookAuthMethod{}}\n ```\n\n - Deletion fails due to the item not existing or other conflict:\n\n ```elixir\n iex> delete_auth_method(%WebhookAuthMethod{id: \"non_existing_id\"})\n {:error, reason}\n ```","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- It is important to ensure that the `WebhookAuthMethod` is not being referenced by other entities before trying deletion to avoid conflicts.\n - This function will return an error tuple if the `WebhookAuthMethod` struct passed to it does not exist in the database.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-notes"},{"type":"function","title":"Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"Retrieves a `WebhookAuthMethod` that matches the given API key for a specified project.\n\nIt uses a secure comparison to match the API key, ensuring that timing attacks are mitigated.","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"- `api_key`: The API key as a binary string to match against existing `WebhookAuthMethod` records.\n - `project`: The `Project` struct to scope the search within its associated `WebhookAuthMethod`s.","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"- A `WebhookAuthMethod` struct if a matching API key is found within the given project's scope.\n - `nil` if there is no `WebhookAuthMethod` with the given API key for the project.","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"- When a matching `WebhookAuthMethod` is found:\n\n ```elixir\n iex> Lightning.Workflows.find_by_api_key(\"existing_api_key\", %Project{id: \"existing_project_id\"})\n %WebhookAuthMethod{}\n ```\n\n - When there is no matching `WebhookAuthMethod`:\n\n ```elixir\n iex> Lightning.Workflows.find_by_api_key(\"non_existing_api_key\", %Project{id: \"existing_project_id\"})\n nil\n ```","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.find_by_id!/1","doc":"Retrieves a `WebhookAuthMethod` by its ID, raising an exception if not found.\n\nThis function is intended for situations where the `WebhookAuthMethod` is expected to exist, and not finding one is an exceptional case that should halt normal flow with an error.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1"},{"type":"function","title":"Parameter - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- `id`: The ID of the `WebhookAuthMethod` to retrieve.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-parameter"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- Returns the `WebhookAuthMethod` struct if found.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-returns"},{"type":"function","title":"Errors - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- Raises `Ecto.NoResultsError` if there is no `WebhookAuthMethod` with the given ID.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-errors"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- When a `WebhookAuthMethod` with the given ID exists:\n\n ```elixir\n iex> Lightning.Workflows.find_by_id!(\"existing_id\")\n %WebhookAuthMethod{}\n ```\n\n - When there is no `WebhookAuthMethod` with the given ID:\n\n ```elixir\n iex> Lightning.Workflows.find_by_id!(\"non_existing_id\")\n ** (Ecto.NoResultsError)\n ```","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"Retrieves a `WebhookAuthMethod` that matches the given username and password within the scope of a specified project.\n\nThe function checks if the provided password is correct for the given username and project. If the password is valid, the corresponding `WebhookAuthMethod` is returned. It is important to handle password comparison securely to prevent timing attacks.","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"- `username`: The username as a string to match against the `WebhookAuthMethod` records.\n - `password`: The plaintext password as a string which will be securely compared to the stored password.\n - `project`: The `Project` struct to scope the search for the `WebhookAuthMethod`.","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"- Returns the matching `WebhookAuthMethod` struct if the username and password are correct within the given project's scope.\n - Returns `nil` if no matching record is found or if the password is invalid.","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"- When a matching `WebhookAuthMethod` is found and the password is valid:\n\n ```elixir\n iex> Lightning.Workflows.find_by_username_and_password(\"existing_username\", \"valid_password\", %Project{id: \"existing_project_id\"})\n %WebhookAuthMethod{}\n ```\n\n - When the username is found but the password is invalid or no matching record is found:\n\n ```elixir\n iex> Lightning.Workflows.find_by_username_and_password(\"existing_username\", \"invalid_password\", %Project{id: \"existing_project_id\"})\n nil\n ```","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.list_for_project/1","doc":"Retrieves a list of `WebhookAuthMethod`s associated with a specific `Project`.\n\nThe function filters `WebhookAuthMethod`s by the provided `Project`'s ID and excludes any methods that are scheduled for deletion.","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.list_for_project/1","doc":"- `project`: The `Project` struct containing the ID of the project for which to list the authentication methods.","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.list_for_project/1","doc":"- A list of `WebhookAuthMethod` structs. This can be an empty list if no methods are associated with the project or if the project does not exist.","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.list_for_project/1","doc":"- When the project exists and has associated auth methods:\n\n ```elixir\n iex> list_for_project(%Project{id: \"existing_project_id\"})\n [%WebhookAuthMethod{}, ...]\n ```\n\n - When the project does not exist or has no associated auth methods:\n\n ```elixir\n iex> list_for_project(%Project{id: \"non_existing_project_id\"})\n []\n ```","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"Retrieves a list of `WebhookAuthMethod`s associated with the specified `Trigger`.\n\nThis function filters out `WebhookAuthMethod`s that are scheduled for deletion, ensuring that only active methods are returned.","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"- `trigger`: A `Trigger` struct whose associated `WebhookAuthMethod`s are to be retrieved.","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"- A list of `WebhookAuthMethod` structs associated with the `Trigger`. If the `Trigger` has no associated methods or if they are all scheduled for deletion, the list will be empty.","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"- When the `Trigger` has associated `WebhookAuthMethod`s not scheduled for deletion:\n\n ```elixir\n iex> Lightning.Workflows.list_for_trigger(%Trigger{id: \"existing_trigger_id\"})\n [%WebhookAuthMethod{}, ...]\n ```\n\n - When the `Trigger` has no associated `WebhookAuthMethod`s or they are all scheduled for deletion:\n\n ```elixir\n iex> Lightning.Workflows.list_for_trigger(%Trigger{id: \"trigger_without_methods\"})\n []\n ```","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.perform/1","doc":"Performs cleanup of `WebhookAuthMethod` records that are marked for permanent deletion.","ref":"Lightning.WebhookAuthMethods.html#perform/1"},{"type":"function","title":"Details - Lightning.WebhookAuthMethods.perform/1","doc":"This function, when invoked with a job argument containing `%{\"type\" => \"purge_deleted\"}`, performs the following operations:\n\n1. It queries all `WebhookAuthMethod` records that are scheduled for deletion (i.e., their `scheduled_deletion` timestamp is in the past).\n2. It then disassociates each of these records from any associated triggers.\n3. Finally, it deletes the `WebhookAuthMethod` records from the database.\n\nThe function operates within the context of an Oban job, utilizing the `perform/1` callback expected by the Oban.Worker behaviour.","ref":"Lightning.WebhookAuthMethods.html#perform/1-details"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.perform/1","doc":"- A `%Oban.Job{args: %{\"type\" => \"purge_deleted\"}}` struct, indicating the job should perform a purge operation.","ref":"Lightning.WebhookAuthMethods.html#perform/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.perform/1","doc":"A tuple `{:ok, %{disassociated_count: integer(), deleted_count: integer()}}` where:\n- `:ok` indicates the operation was successful.\n- `disassociated_count` is the number of `WebhookAuthMethod` records successfully disassociated from triggers.\n- `deleted_count` is the number of `WebhookAuthMethod` records successfully deleted.","ref":"Lightning.WebhookAuthMethods.html#perform/1-returns"},{"type":"function","title":"Example - Lightning.WebhookAuthMethods.perform/1","doc":"```elixir\n%Oban.Job{\nargs: %{\"type\" => \"purge_deleted\"}\n}\n|> MyModule.perform()\n# => {:ok, %{disassociated_count: 2, deleted_count: 2}}\n```","ref":"Lightning.WebhookAuthMethods.html#perform/1-example"},{"type":"function","title":"Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"Schedules a `WebhookAuthMethod` for deletion by setting its `scheduled_deletion` date.\n\nThis function does not delete the record immediately. Instead, it sets the `scheduled_deletion` field to a date in the future as defined by the application's environment settings.\nThe default behavior, in the absence of environment configuration, is to schedule the deletion for the current date and time, effectively marking it for immediate deletion.\n\nThe scheduled deletion date is determined by the `:purge_deleted_after_days` configuration in the application environment.\nIf this configuration is not present, the function defaults to 0 days, which schedules the deletion for the current date and time.","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"- `webhook_auth_method`: A `WebhookAuthMethod` struct that is to be scheduled for deletion.","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"- `{:ok, webhook_auth_method}`: Returns an `:ok` tuple with the updated webhook auth method struct if the\n update was successful.\n - `{:error, changeset}`: Returns an `:error` tuple with the changeset if the update failed.","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"- When a webhook auth method is successfully scheduled for deletion:\n\n ```elixir\n iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{id: some_id})\n {:ok, %WebhookAuthMethod{scheduled_deletion: deletion_date}}\n ```\n\n - When scheduling for deletion fails due to validation errors:\n\n ```elixir\n iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.update_auth_method/3","doc":"Updates an existing `WebhookAuthMethod` with the provided attributes and creates an audit event.\n\nThis function applies the given changes to the specified `WebhookAuthMethod` and records the update action in the audit log. It wraps the operations within a database transaction to ensure data integrity.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- `webhook_auth_method`: The `WebhookAuthMethod` struct to be updated.\n - `attrs`: A map containing the updated values for the fields of the `WebhookAuthMethod`.\n - `actor`: The user performing the update, represented by a `%User{}` struct.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- `{:ok, %WebhookAuthMethod{}}`: A tuple containing `:ok` and the updated `WebhookAuthMethod` struct if the update is successful.\n - `{:error, %Ecto.Changeset{}}`: A tuple containing `:error` and the changeset with errors if the update fails.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- Successful update:\n\n ```elixir\n iex> update_auth_method(webhook_auth_method, %{field: new_value}, actor: %User{})\n {:ok, %WebhookAuthMethod{}}\n ```\n\n - Update fails due to invalid data:\n\n ```elixir\n iex> update_auth_method(webhook_auth_method, %{field: bad_value}, actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- The function uses `Ecto.Multi` to perform a transaction, ensuring that either all changes apply successfully, or none do if there's an error.\n - An audit event is recorded with the `Lightning.WebhookAuthMethodAudit.event/4` function, capturing the details of the update and the acting user.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-notes"},{"type":"function","title":"Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"Updates the association of `WebhookAuthMethod`s for a given `Trigger` and logs the changes as audit events.\n\nThis function replaces the current `WebhookAuthMethod` associations of a `Trigger` with the provided list of `WebhookAuthMethod`s. It creates audit events for each added and removed `WebhookAuthMethod`, ensuring full traceability of changes.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- `trigger`: The `Trigger` struct whose associated `WebhookAuthMethod`s are to be updated.\n - `auth_methods`: A list of `WebhookAuthMethod` structs to be associated with the `Trigger`.\n - `actor`: The user performing the update, represented by a `%User{}` struct.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- `{:ok, %Trigger{}}`: A tuple containing `:ok` and the updated `Trigger` struct if the associations are updated successfully.\n - `{:error, %Ecto.Changeset{}}`: A tuple containing `:error` and the changeset with errors if the update fails.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- Successful association update:\n\n ```elixir\n iex> update_trigger_auth_methods(trigger, [webhook_auth_method], actor: %User{})\n {:ok, %Trigger{}}\n ```\n\n - Update fails due to an invalid changeset:\n\n ```elixir\n iex> update_trigger_auth_methods(trigger, [invalid_webhook_auth_method], actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- The function uses `Ecto.Multi` to perform a transaction, which ensures either all changes are applied or none at all if an error occurs.\n - Audit events for the additions and removals of `WebhookAuthMethod`s are recorded using `WebhookAuthMethodAudit.event/4`.\n - The function preloads the existing `webhook_auth_methods` of the `Trigger` before performing updates.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-notes"},{"type":"module","title":"Lightning.WorkOrder","doc":"Ecto model for WorkOrders.","ref":"Lightning.WorkOrder.html"},{"type":"function","title":"Lightning.WorkOrder.validate/1","doc":"","ref":"Lightning.WorkOrder.html#validate/1"},{"type":"type","title":"Lightning.WorkOrder.t/0","doc":"","ref":"Lightning.WorkOrder.html#t:t/0"},{"type":"module","title":"Lightning.Workers","doc":"Lightning uses external worker processes to execute workflow jobs.\n\nThis module deals with the security tokens and the formatting used on\nthe communication with the workers.","ref":"Lightning.Workers.html"},{"type":"function","title":"Lightning.Workers.generate_run_token/2","doc":"","ref":"Lightning.Workers.html#generate_run_token/2"},{"type":"function","title":"Lightning.Workers.verify_run_token/2","doc":"Verifies and validates a run token.\n\nIt requires a context map with the following keys:\n\n- `:id` - the run id that the token was issued with.\n\nOptionally takes a context map that will be passed to the validation:\n\n- `:current_time` - the current time as a `DateTime` struct.","ref":"Lightning.Workers.html#verify_run_token/2"},{"type":"function","title":"Lightning.Workers.verify_worker_token/2","doc":"Verifies and validates a worker token.\n\nOptionally takes a context map that will be passed to the validation:\n\n- `:current_time` - the current time as a `DateTime` struct.","ref":"Lightning.Workers.html#verify_worker_token/2"},{"type":"module","title":"Lightning.Workers.RunToken","doc":"JWT token configuration to verify if workers work is legit.","ref":"Lightning.Workers.RunToken.html"},{"type":"function","title":"Lightning.Workers.RunToken.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.Workers.RunToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Workers.RunToken.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.Workers.RunToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Workers.RunToken.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.Workers.RunToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Workers.RunToken.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.Workers.RunToken.html#verify_and_validate!/3"},{"type":"module","title":"Lightning.Workers.Token","doc":"JWT token configuration to authenticate workers.","ref":"Lightning.Workers.Token.html"},{"type":"function","title":"Lightning.Workers.Token.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.Workers.Token.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Workers.Token.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.Workers.Token.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Workers.Token.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.Workers.Token.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Workers.Token.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.Workers.Token.html#verify_and_validate!/3"},{"type":"task","title":"mix lightning.gen_encryption_key","doc":"Helper to generate a unique encryption key for Vault","ref":"Mix.Tasks.Lightning.GenEncryptionKey.html"},{"type":"task","title":"mix lightning.gen_worker_keys","doc":"Helper to generate the private and public keys for worker authentication","ref":"Mix.Tasks.Lightning.GenWorkerKeys.html"},{"type":"task","title":"mix lightning.install_adaptor_icons","doc":"Installs the adaptor icons","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#get/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#get!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#head/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#head!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#options/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#options!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#patch/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#patch!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.request/2","doc":"Perform a request.","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request/2"},{"type":"function","title":"Options - Mix.Tasks.Lightning.InstallAdaptorIcons.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request/2-options"},{"type":"function","title":"Examples - Mix.Tasks.Lightning.InstallAdaptorIcons.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request/2-examples"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request!/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#trace/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#trace!/3"},{"type":"type","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#t:option/0"},{"type":"task","title":"mix lightning.install_runtime","doc":"Installs the following NodeJS packages:\n\n- core\n- language-common","ref":"Mix.Tasks.Lightning.InstallRuntime.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.packages/0","doc":"","ref":"Mix.Tasks.Lightning.InstallRuntime.html#packages/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.run/1","doc":"","ref":"Mix.Tasks.Lightning.InstallRuntime.html#run/1"},{"type":"task","title":"mix lightning.install_schemas","doc":"Install the credential json schemas\nUse --exclude language-package1, language-package2 to exclude specific packages","ref":"Mix.Tasks.Lightning.InstallSchemas.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete/3","doc":"Issues a DELETE request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.fetch_schemas/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#fetch_schemas/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get/3","doc":"Issues a GET request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head/3","doc":"Issues a HEAD request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options/3","doc":"Issues an OPTIONS request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.parse_excluded/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#parse_excluded/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch/4","doc":"Issues a PATCH request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.persist_schema/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#persist_schema/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post/4","doc":"Issues a POST request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_headers/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_body/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_headers/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_options/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_options/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_params/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_params/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_url/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_body/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_chunk/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_chunk/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_headers/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_status_code/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_status_code/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_url/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put/4","doc":"Issues a PUT request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"Issues an HTTP request using an `HTTPoison.Request` struct.\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1"},{"type":"function","title":"Redirect handling - Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1-redirect-handling"},{"type":"function","title":"Examples - Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"request = %HTTPoison.Request{\n method: :post,\n url: \"https://my.website.com\",\n body: \"{\\\"foo\\\": 3}\",\n headers: [{\"Accept\", \"application/json\"}]\n }\n\n request(request)","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1-examples"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"Issues an HTTP request with the given method to the given url.\n\nThis function is usually used indirectly by `get/3`, `post/4`, `put/4`, etc\n\nArgs:\n * `method` - HTTP method as an atom (`:get`, `:head`, `:post`, `:put`,\n `:delete`, etc.)\n * `url` - target url as a binary string or char list\n * `body` - request body. See more below\n * `headers` - HTTP headers as an orddict (e.g., `[{\"Accept\", \"application/json\"}]`)\n * `options` - Keyword list of options\n\nBody: see type `HTTPoison.Request`\n\nOptions: see type `HTTPoison.Request`\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5"},{"type":"function","title":"Redirect handling - Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5-redirect-handling"},{"type":"function","title":"Examples - Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"request(:post, \"https://my.website.com\", \"{\\\"foo\\\": 3}\", [{\"Accept\", \"application/json\"}])","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5-examples"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request!/1","doc":"Issues an HTTP request an `HTTPoison.Request` struct.\nexception in case of failure.\n\n`request!/1` works exactly like `request/1` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request!/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an\nexception in case of failure.\n\n`request!/5` works exactly like `request/5` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request!/5"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.run/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#run/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#start/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.stream_next/1","doc":"Requests the next message to be streamed for a given `HTTPoison.AsyncResponse`.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#stream_next/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.write_schema/3","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#write_schema/3"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.body/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:body/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.headers/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:headers/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.method/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:method/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.options/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:options/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.params/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:params/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.request/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:request/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.url/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:url/0"},{"type":"extras","title":"Lightning","doc":"# OpenFn/Lightning [![CircleCI](https://dl.circleci.com/status-badge/img/gh/OpenFn/lightning/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/OpenFn/lightning/tree/main) [![codecov](https://codecov.io/gh/OpenFn/lightning/branch/main/graph/badge.svg?token=FfDMxdGL3a)](https://codecov.io/gh/OpenFn/lightning) ![Docker Pulls](https://img.shields.io/docker/pulls/openfn/lightning)\n\nLightning ⚡ (aka \"OpenFn v2\") is a workflow automation platform that's used to\nautomate critical business processes and integrate information systems. From\nlast-mile services to national-level reporting, it boosts efficiency &\neffectiveness while enabling secure, stable, scalable interoperability and data\nintegration at all levels.\n\n**Use it online at [app.openfn.org](https://app.openfn.org)**\n\n**Explore in a sandbox on [demo.openfn.org](#demo-sandbox)**\n\n**Or learn more at\n[docs.openfn.org](https://docs.openfn.org/documentation/about-lightning)**\n\n> OpenFn **Lightning** is:\n>\n> - the **latest version** of OpenFn: first launched in 2014, it's been tried\n> and tested by NGOs and governments in 40+ countries\n> - fully **open source**: there's no \"community edition\" and \"premium edition\",\n> you get the same product whether you are self-hosting or using the\n> OpenFn.org software-as-a-service\n> - the leading [DPGA](https://digitalpublicgoods.net/) certified **Digital\n> Public Good** for workflow automation\n> - a [Digital Square](https://digitalsquare.org/digital-health-global-goods)\n> certified **Global Good for Health**","ref":"readme.html"},{"type":"extras","title":"Contents - Lightning","doc":"- [Demo](#demo)\n- [Features](#features)\n - [Build](#build)\n - [Monitor](#monitor)\n - [Manage](#manage)\n - [Roles and permissions](#roles-and-permissions)\n - [Roadmap](#roadmap)\n- [Getting Started](#getting-started)\n - [**Run** via Docker](#run-via-docker)\n - [**Deploy** on external infrastructure](#deploy-on-external-infrastructure)\n - [**Dev** on Lightning locally](#dev-on-lightning-locally)\n- [Security and Standards](#security-and-standards)\n- [**Contribute** to this project](#contribute-to-this-project)\n - [Pick up an issue](#pick-up-an-issue)\n - [Open a pull request](#open-a-pull-request)\n - [Generate the docs pages](#generate-the-docs-pages)\n- [Server Specs for Self-Hosting](#server-specs-for-self-hosting)\n- [Benchmarking](#benchmarking)\n- [Troubleshooting](#troubleshooting)\n - [Problems with environment variables](#problems-with-environment-variables)\n - [Problems with Postgres](#problems-with-postgres)\n - [Problems with Debian](#problems-with-debian)\n - [Problems with Docker](#problems-with-docker)\n - [Problems with Rambo](#problems-with-rambo)\n- [Support](#support)","ref":"readme.html#contents"},{"type":"extras","title":"Demo - Lightning","doc":"Watch a short [demo video](https://www.youtube.com/watch?v=BNaxlHAWb5I) or\nexplore a **[public sandbox](https://demo.openfn.org/)** with the login details\nbelow, but please note that this deployment is reset every night at 12:00:00 UTC\nand is 100% publicly accessible. **_Don't build anything you want to keep, or\nkeep private!_**\n\n```\nusername: demo@openfn.org\npassword: welcome12345\n```","ref":"readme.html#demo"},{"type":"extras","title":"Features - Lightning","doc":"#","ref":"readme.html#features"},{"type":"extras","title":"Build - Lightning","doc":"Plan and build workflows using Lightning's visual interface to quickly define\nwhen, where and what you want your automation to do.\n\n \n \n \n\nUse our\n[CLI](https://github.com/OpenFn/kit/blob/main/packages/cli/README.md#openfncli)\nto quickly build, edit and deploy projects from the comfort of your own code\neditor.\n\n#","ref":"readme.html#build"},{"type":"extras","title":"Monitor - Lightning","doc":"Monitor all workflow activity in one place.\n\n \n \n \n\n- Filter and search runs to identify issues that need addressing and follow how\n a specific request has been processed\n- Configure alerts to be notified on run failures\n- Receive a project digest for a daily/weekly/monthly summary of your project\n activity\n\n#","ref":"readme.html#monitor"},{"type":"extras","title":"Manage - Lightning","doc":"Manage users and access by project.\n\n \n \n \n\n#","ref":"readme.html#manage"},{"type":"extras","title":"Roles and permissions - Lightning","doc":"Authorization is a central part of Lightning. As such, users are given different\nroles which determine what level of access they have for resources in the\napplication. For more details about roles and permissions in Lightning, please\nrefer to our\n[documentation](https://docs.openfn.org/documentation/about-lightning#roles-and-permissions).\n\n#","ref":"readme.html#roles-and-permissions"},{"type":"extras","title":"Roadmap - Lightning","doc":"View our\n[public GitHub project](https://github.com/orgs/OpenFn/projects/3/views/1) to\nsee what we're working on now and what's coming next.","ref":"readme.html#roadmap"},{"type":"extras","title":"Getting Started - Lightning","doc":"- If you only want to [_**RUN**_](#run-via-docker) Lightning on your own server,\n we recommend using Docker.\n- If you want to [_**DEPLOY**_](#deploy-on-external-infrastructure) Lightning,\n we recommend Docker builds and Kubernetes.\n- If you want to [_**CONTRIBUTE**_](#contribute-to-this-project) to the project,\n we recommend\n [running Lightning on your local machine](#run-lightning-locally).\n\n### **Run** via Docker\n\n1. Install the latest version of\n [Docker](https://docs.docker.com/engine/install/)\n2. Clone [this repo](https://github.com/OpenFn/Lightning) using git\n3. Setup PostgreSQL database with:\n `docker compose build && docker compose run --rm web mix ecto.migrate`\n4. Run Lightning and PostgresSQL with: `docker compose up`\n\nBy default the application will be running at\n[localhost:4000](http://localhost:4000/).\n\nSee [\"Problems with Docker\"](#problems-with-docker) for additional\ntroubleshooting help. Note that you can also create your own\n`docker-compose.yml` file, configuring a postgres database and using a\n[pre-built image](https://hub.docker.com/repository/docker/openfn/lightning)\nfrom Dockerhub.\n\n### **Deploy** on external infrastructure\n\nHead to the [Deploy](https://docs.openfn.org/documentation/deploy/options)\nsection of our docs site to get started.\n\nFor technical guidelines, see [deployment considerations](DEPLOYMENT.md) for\nmore detailed information.\n\n### **Dev** on Lightning locally\n\n##","ref":"readme.html#getting-started"},{"type":"extras","title":"Clone the repo and optionally set ENVs - Lightning","doc":"```sh\ngit clone git@github.com:OpenFn/Lightning.git # or from YOUR fork!\ncd Lightning\ncp .env.example .env # and adjust as necessary!\n```\n\nTake note of database names and ports in particular—they've got to match across\nyour Postgres setup and your ENVs. You can run lightning without any ENVs\nassuming a vanilla postgres setup (see below), but you may want to make\nadjustments.\n\n##","ref":"readme.html#clone-the-repo-and-optionally-set-envs"},{"type":"extras","title":"Database Setup - Lightning","doc":"If you're already using Postgres locally, create a new database called\n`lightning_dev`, for example.\n\nIf you'd rather use Docker to set up a Postgres DB, create a new volume and\nimage:\n\n```sh\ndocker volume create lightning-postgres-data\n\ndocker create \\\n --name lightning-postgres \\\n --mount source=lightning-postgres-data,target=/var/lib/postgresql/data \\\n --publish 5432:5432 \\\n -e POSTGRES_PASSWORD=postgres \\\n postgres:15.3-alpine\n\ndocker start lightning-postgres\n```\n\n##","ref":"readme.html#database-setup"},{"type":"extras","title":"Elixir & Ecto Setup - Lightning","doc":"We use [asdf](https://github.com/asdf-vm/asdf) to configure our local\nenvironments. Included in the repo is a `.tool-versions` file that is read by\nasdf in order to dynamically make the specified versions of Elixir and Erlang\navailable. You'll need asdf plugins for\n[Erlang](https://github.com/asdf-vm/asdf-erlang),\n[NodeJs](https://github.com/asdf-vm/asdf-nodejs)\n[Elixir](https://github.com/asdf-vm/asdf-elixir) and\n[k6](https://github.com/grimoh/asdf-k6).\n\nWe use [libsodium](https://doc.libsodium.org/) for encoding values as required\nby the\n[Github API](https://docs.github.com/en/rest/guides/encrypting-secrets-for-the-rest-api).\nYou'll need to install `libsodium` in order for the application to compile.\n\nFor Mac Users:\n\n```sh\nbrew install libsodium\n```\n\nFor Debian Users:\n\n```sh\nsudo apt-get install libsodium-dev\n```\n\nYou can find more on\n[how to install libsodium here](https://doc.libsodium.org/installation)\n\n```sh\nasdf install # Install language versions\nmix local.hex\nmix deps.get\nmix local.rebar --force\nmix ecto.create # Create a development database in Postgres\nmix ecto.migrate\n[[ $(uname -m) == 'arm64' ]] && CPATH=/opt/homebrew/include LIBRARY_PATH=/opt/homebrew/lib mix deps.compile enacl # Force compile enacl if on M1\n[[ $(uname -m) == 'arm64' ]] && mix compile.rambo # Force compile rambo if on M1\nmix lightning.install_runtime\nmix lightning.install_schemas\nmix lightning.install_adaptor_icons\nnpm install --prefix assets\n```\n\n##","ref":"readme.html#elixir-ecto-setup"},{"type":"extras","title":"Run the app - Lightning","doc":"Lightning is a web app. To run it in interactive Elixir mode, start the\ndevelopment server by running with your environment variables by running:\n\n```sh\niex -S mix phx.server\n```\n\nor if you have set up custom environment variables, run:\n\n```sh\nenv $(cat .env | grep -v \"#\" | xargs ) iex -S mix phx.server\n```\n\nOnce the server has started, head to [`localhost:4000`](http://localhost:4000)\nin your browser.\n\n##","ref":"readme.html#run-the-app"},{"type":"extras","title":"Run the tests - Lightning","doc":"Before the first time running the tests, you need a test database setup.\n\n```sh\nMIX_ENV=test mix ecto.create\n```\n\nAnd then after that run the tests using:\n\n```sh\nMIX_ENV=test mix test\n```\n\nWe also have `test.watch` installed which can be used to rerun the tests on file\nchanges.","ref":"readme.html#run-the-tests"},{"type":"extras","title":"Security and Standards - Lightning","doc":"We use a host of common Elixir static analysis tools to help us avoid common\npitfalls and make sure we keep everything clean and consistent.\n\nIn addition to our test suite, you can run the following commands:\n\n- `mix format --check-formatted` Code formatting checker, run again without the\n `--check-formatted` flag to have your code automatically changed.\n- `mix dialyzer` Static analysis for type mismatches and other common warnings.\n See [dialyxir](https://github.com/jeremyjh/dialyxir).\n- `mix credo --strict --all` Static analysis for consistency, and coding\n standards. See [Credo](https://github.com/rrrene/credo).\n- `mix sobelow` Check for commonly known security exploits. See\n [Sobelow](https://sobelow.io/).\n- `MIX_ENV=test mix coveralls` Test coverage reporter. This command also runs\n the test suite, and can be used in place of `mix test` when checking\n everything before pushing your code. See\n [excoveralls](https://github.com/parroty/excoveralls).\n\n> For convenience there is a `verify` mix task that runs all of the above and\n> defaults the `MIX_ENV` to `test`.\n\nFor more guidance on security best practices for workflow automation\nimplementations, check out OpenFn Docs:\n[docs.openfn.org/documentation/getting-started/security](https://docs.openfn.org/documentation/getting-started/security)\n\n## **Contribute** to this project\n\nFirst, thanks for being here! You're contributing to a digital public good that\nwill always be free and open source and aimed at serving innovative NGOs,\ngovernments, and social impact organizations the world over! You rock. ❤️\n\nFYI, Lightning is built in [Elixir](https://elixir-lang.org/), harnessing the\n[Phoenix Framework](https://www.phoenixframework.org/). Currently, the only\nunbundled dependency is a [PostgreSQL](https://www.postgresql.org/) database.\n\nIf you'd like to contribute to this projects, follow the steps below:\n\n#","ref":"readme.html#security-and-standards"},{"type":"extras","title":"Pick up an issue - Lightning","doc":"Read through the existing [issues](https://github.com/OpenFn/Lightning/issues),\nassign yourself to the issue you have chosen. Leave a comment on the issue to\nlet us know you'll be working on it, and if you have any questions of\nclarifications that would help you get started ask them there - we will get back\nto you as soon as possible.\n\nIf there isn't already an issue for the feature you would like to contribute,\nplease start a discussion in our\n[community forum](https://community.openfn.org/c/feature-requests/12).\n\n#","ref":"readme.html#pick-up-an-issue"},{"type":"extras","title":"Open a pull request - Lightning","doc":"1. Clone the Lightning repository, then\n [fork it](https://docs.github.com/en/get-started/quickstart/fork-a-repo).\n\n2. Run through [setting up your environment](#set-up-your-environment) and make\n your changes.\n\n3. Make sure you have written your tests and updated /CHANGELOG.md (in the\n 'Unreleased' section, add a short description of the changes you are making,\n along with a link to your issue).\n\n4. Open a draft pull request by clicking \"Contribute > Open Pull Request\" from\n your forked repository. Fill out the pull request template (this will **be**\n added automatically for you), then make sure to self-review your code and go\n through the 'Review checklist'. Don't worry about the QA checkbox, our\n product manager Amber will tick that once she has reviewed your PR. You can\n leave any notes for the reviewer in a comment.\n\n5. Once you're ready to submit a pull request, you can mark your draft PR as\n 'Ready for review' and assign @stuartc or @taylordowns2000.\n\n#","ref":"readme.html#open-a-pull-request"},{"type":"extras","title":"Generate the docs pages - Lightning","doc":"You can generate the HTML and EPUB documentation locally using:\n\n`mix docs` and opening `doc/index.html` in your browser.","ref":"readme.html#generate-the-docs-pages"},{"type":"extras","title":"Server Specs for Self-Hosting - Lightning","doc":"For recommend server specifications for self-hosting of Lightning, head to the\n[deployment planning](https://docs.openfn.org/documentation/deploy/options)\nsection of the documentation or check out this\n[self-hosting thread](https://community.openfn.org/t/specs-for-self-hosting-lightning/292)\non our community forum.","ref":"readme.html#server-specs-for-self-hosting"},{"type":"extras","title":"Benchmarking - Lightning","doc":"We are using [k6](https://k6.io/) to benchmark Lightning. Under `benchmarking`\nfolder you can find a script for benchmarking Webhook Workflows.\n\nSee [Benchmarking](benchmarking/README.md) for more detailed information.","ref":"readme.html#benchmarking"},{"type":"extras","title":"Troubleshooting - Lightning","doc":"#","ref":"readme.html#troubleshooting"},{"type":"extras","title":"Problems with environment variables - Lightning","doc":"For troubleshooting custom environment variable configuration it's important to\nknow how an Elixir app loads and modifies configuration. The order is as\nfollows:\n\n1. Stuff in `config.exs` is loaded.\n2. _That_ is then modified (think: _overwritten_) by stuff your ENV-specific\n config: `dev.exs`, `prod.exs` or `test.exs`.\n3. _That_ is then modified by `runtime.exs` which is where you are allowed to\n use `System.env()`\n4. _Finally_ `init/2` (if present in a child application) gets called (which\n takes the config which has been set in steps 1-3) when that child application\n is started during the parent app startup defined in `application.ex`.\n\n#","ref":"readme.html#problems-with-environment-variables"},{"type":"extras","title":"Problems with Postgres - Lightning","doc":"If you're having connecting issues with Postgres, check the database section of\nyour `.env` to ensure the DB url is correctly set for your environment — note\nthat composing a DB url out of other, earlier declared variables, does not work\nwhile using `xargs`.\n\n#","ref":"readme.html#problems-with-postgres"},{"type":"extras","title":"Problems with Debian - Lightning","doc":"If you're getting this error on debian\n\n```\n==> earmark_parser\nCompiling 1 file (.yrl)\n/usr/lib/erlang/lib/parsetools-2.3.1/include/yeccpre.hrl: no such file or directory\ncould not compile dependency :earmark_parser, \"mix compile\" failed. You can recompile this dependency with \"mix deps.compile earmark_parser\", update it with \"mix deps.update earmark_parser\" or clean it with \"mix deps.clean earmark_parser\"\n```\n\nYou need to install erlang development environment `sudo apt install erlang-dev`\n[refer to this issue](https://github.com/elixir-lang/ex_doc/issues/1441)\n\n#","ref":"readme.html#problems-with-debian"},{"type":"extras","title":"Problems with Docker - Lightning","doc":"##","ref":"readme.html#problems-with-docker"},{"type":"extras","title":"Versions - Lightning","doc":"The build may not work on old versions of Docker and Docker compose. It has been\ntested against:\n\n```\nDocker version 20.10.17, build 100c701\nDocker Compose version v2.6.0\n```\n\n##","ref":"readme.html#versions"},{"type":"extras","title":"Starting from scratch - Lightning","doc":"If you're actively working with docker, you start experiencing issues, and you\nwould like to start from scratch you can clean up everything and start over like\nthis:\n\n```sh\n# To remove any ignored files and reset your .env to it's example\ngit clean -fdx && cp .env.example .env\n# You can skip the line below if you want to keep your database\ndocker compose down --rmi all --volumes\n\ndocker compose build --no-cache web && \\\n docker compose create --force-recreate\n\ndocker compose run --rm web mix ecto.migrate\ndocker compose up\n```\n\n##","ref":"readme.html#starting-from-scratch"},{"type":"extras","title":"Apple Silicon - Lightning","doc":"When running `docker compose up` on Apple Silicon (M1, M2, M3), you might encounter the following error:\n\n```\n> [web 20/20] RUN npm install --prefix assets:\n0.091 rosetta error: failed to open elf at /lib64/ld-linux-x86-64.so.2\n0.091 Trace/breakpoint trap\n------\nfailed to solve: process \"/bin/sh -c npm install --prefix assets\" did not complete successfully: exit code: 133\n```\n\nYou can solve this by setting the default docker platform to `linux/amd64`, i.e. `DOCKER_DEFAULT_PLATFORM=linux/amd64`.\nYou can read more on this here: https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direc\n\nYou might also run into:\n\n```\n[notice] Application ssl exited: exited in: :ssl_app.start(:normal, [])\n ** (EXIT) an exception was raised:\n ** (ArgumentError) could not call Module.put_attribute/3 because the module Lightning.MixProject is already compiled\n (elixir 1.16.2) lib/module.ex:2360: Module.assert_not_readonly!/2\n (elixir 1.16.2) lib/module.ex:2041: Module.__put_attribute__/5\n (ssl 11.1.4) ssl_app.erl:35: :ssl_app.stop/1\n (kernel 9.2.4) application_master.erl:293: :application_master.start_it_old/4\n\n** (MatchError) no match of right hand side value: {:error, {:ssl, {:bad_return, {{:ssl_app, :start, [:normal, []]}, {:EXIT, {%ArgumentError{message: \"could not call Module.put_attribute/3 because the module Lightning.MixProject is already compiled\"}, [{Module, :assert_not_readonly!, 2, [file: ~c\"lib/module.ex\", line: 2360]}, {Module, :__put_attribute__, 5, [file: ~c\"lib/module.ex\", line: 2041]}, {:ssl_app, :stop, 1, [file: ~c\"ssl_app.erl\", line: 35]}, {:application_master, :start_it_old, 4, [file: ~c\"application_master.erl\", line: 293]}]}}}}}}\n```\n\nYou can resolve this by setting `ERL_FLAGS=\"+JPperf true\"` env to the failing stage.\nYou can follow this thread on our community forum for more info: https://community.openfn.org/t/lightning-prebuilt-images-throw-no-matching-manifest-for-linux-arm64-v8-in-the-manifest-list-entries/465/15\n\n#","ref":"readme.html#apple-silicon"},{"type":"extras","title":"Problems with Rambo - Lightning","doc":"When running `mix compile.rambo` on Apple Silicon (an Apple M1/M2, `macarm`,\n`aarch64-apple-darwin`) and encountering the following error:\n\n```\n** (RuntimeError) Rambo does not ship with binaries for your environment.\n\n aarch64-apple-darwin22.3.0 detected\n\nInstall the Rust compiler so a binary can be prepared for you.\n\n lib/mix/tasks/compile.rambo.ex:89: Mix.Tasks.Compile.Rambo.compile!/0\n lib/mix/tasks/compile.rambo.ex:51: Mix.Tasks.Compile.Rambo.run/1\n (mix 1.14.2) lib/mix/task.ex:421: anonymous fn/3 in Mix.Task.run_task/4\n (mix 1.14.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2\n```\n\nYou can resolve this error by installing the Rust compiler using Homebrew. Run\nthe following command in your terminal: `brew install rust`\n\nIf you have already compiled Rambo explicitly via `mix compile.rambo`, and you\nare still seeing the following error:\n\n```\nsh: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: No such file or directory\nsh: line 0: exec: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: cannot execute: No such file or directory\n```\n\nYou can try renaming `deps/rambo/priv/rambo-mac` to `deps/rambo/priv/rambo`.\n\nIf neither of the approaches above work, please raise an issue.","ref":"readme.html#problems-with-rambo"},{"type":"extras","title":"Support - Lightning","doc":"If you have any questions, feedback, or issues, please:\n\n- Post on the OpenFn Community at\n [community.openfn.org](https://community.openfn.org)\n- Open an issue directly on this GitHub Repo:\n [github.com/OpenFn/Lightning/issues](https://github.com/OpenFn/Lightning/issues)","ref":"readme.html#support"},{"type":"extras","title":"Running Locally","doc":"# Running Lightning Locally\n\nThis guide provides instructions for running Lightning locally, either by\ninstalling dependencies on your machine or using Docker.","ref":"runninglocal.html"},{"type":"extras","title":"By Installing Dependencies - Running Locally","doc":"#","ref":"runninglocal.html#by-installing-dependencies"},{"type":"extras","title":"Setup - Running Locally","doc":"##","ref":"runninglocal.html#setup"},{"type":"extras","title":"Postgres - Running Locally","doc":"Requires `postgres 15`.\nWhen running in `dev` mode, the app will use the following credentials to authenticate:\n- `PORT`: `5432`\n- `USER`: `postgres`\n- `PASSWORD`: `postgres`\n- `DATABASE`: `lightning_dev`\n\nThis can however be overriden by specifying a `DATABASE_URL` env var.\ne.g. `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/lightning_dev`\n\nWe recommend that you use docker for running postgres as you'll get an exact version that we use:\n\n```sh\ndocker volume create lightning-postgres-data\n\ndocker create \\\n --name lightning-postgres \\\n --mount source=lightning-postgres-data,target=/var/lib/postgresql/data \\\n --publish 5432:5432 \\\n -e POSTGRES_PASSWORD=postgres \\\n postgres:15.3-alpine\n\ndocker start lightning-postgres\n```\n\n##","ref":"runninglocal.html#postgres"},{"type":"extras","title":"Elixir, NodeJS - Running Locally","doc":"We use [asdf](https://github.com/asdf-vm/asdf) to configure our local\nenvironments. Included in the repo is a `.tool-versions` file that is read by\nasdf in order to dynamically make the specified versions of Elixir, Erlang and NodeJs\navailable. You'll need asdf plugins for\n[Erlang](https://github.com/asdf-vm/asdf-erlang),\n[NodeJs](https://github.com/asdf-vm/asdf-nodejs)\n[Elixir](https://github.com/asdf-vm/asdf-elixir) and\n[k6](https://github.com/grimoh/asdf-k6).\n\n##","ref":"runninglocal.html#elixir-nodejs"},{"type":"extras","title":"Libsodium - Running Locally","doc":"We use [libsodium](https://doc.libsodium.org/) for encoding values as required\nby the\n[Github API](https://docs.github.com/en/rest/guides/encrypting-secrets-for-the-rest-api).\nYou'll need to install `libsodium` in order for the application to compile.\n\nFor Mac Users:\n\n```sh\nbrew install libsodium\n```\n\nFor Debian Users:\n\n```sh\nsudo apt-get install libsodium-dev\n```\n\nYou can find more on\n[how to install libsodium here](https://doc.libsodium.org/installation)\n\n##","ref":"runninglocal.html#libsodium"},{"type":"extras","title":"Compilation and Assets - Running Locally","doc":"```sh\nasdf install # Install language versions\nmix local.hex\nmix deps.get\nmix local.rebar --force\n[[ $(uname -m) == 'arm64' ]] && CPATH=/opt/homebrew/include LIBRARY_PATH=/opt/homebrew/lib mix deps.compile enacl # Force compile enacl if on M1\n[[ $(uname -m) == 'arm64' ]] && mix compile.rambo # Force compile rambo if on M1\nmix lightning.install_runtime\nmix lightning.install_schemas\nmix lightning.install_adaptor_icons\nmix ecto.create\nmix ecto.migrate\nnpm install --prefix assets\n```\n\nIn case you encounter errors running any of these commands, see the [troubleshooting guide](README.md#troubleshooting) for\nknown errors.\n\n#","ref":"runninglocal.html#compilation-and-assets"},{"type":"extras","title":"Running the App - Running Locally","doc":"To start the lightning server:\n\n```sh\nmix phx.server\n```\n\nOnce the server has started, head to [`localhost:4000`](http://localhost:4000)\nin your browser.\n\nBy default, the `worker` is started when run `mix phx.server` in `dev` mode. In case you\ndon't want to have your worker started in `dev`, set `RTM=false`:\n\n```sh\nRTM=false mix phx.server\n```","ref":"runninglocal.html#running-the-app"},{"type":"extras","title":"Using Docker - Running Locally","doc":"There is an existing `docker-compose.yaml` file in the project's root which has all the\nservices required. To start your services:\n\n```sh\ndocker compose up\n```\n\nThere 2 docker files in the root, `Dockerfile` builds the app in `prod` mode while `Dockerfile-dev`\nruns it in `dev` mode. It is important to note that `mix commands` do not work in the `prod` images.\n\nFor exmaple, to run migrations in `dev` mode you run:\n\n```sh\ndocker compose run --rm web mix ecto.migrate\n```\n\nWhile in `prod` mode:\n\n```sh\ndocker compose run --rm web /app/bin/lightning eval \"Lightning.Release.migrate()\"\n```\n\n#","ref":"runninglocal.html#using-docker"},{"type":"extras","title":"Configuring the Worker - Running Locally","doc":"By default, lightning starts the `worker` when running in `dev`. This can also be configured using\n`RTM` env var. In case you don't want the hassle of configuring the worker in `dev`, you can just\nremove/comment out the `worker` service from the `docker-compose.yaml` file because lightning will\nstart it for you.\n\n[Learn more about configuring workers](WORKERS.md)\n\n#","ref":"runninglocal.html#configuring-the-worker"},{"type":"extras","title":"Problems with Apple Silicon - Running Locally","doc":"You might run into some errors when running the docker containers on Apple Silicon.\n[We have documented the known ones here](README.md#problems-with-docker)","ref":"runninglocal.html#problems-with-apple-silicon"},{"type":"extras","title":"Deployment","doc":"# Deployment\n\nHead to the [Deploy](https://docs.openfn.org/documentation/deploy/options)\nsection of our docs site to get started.\n\nSee below for technical considerations and instructions.","ref":"deployment.html"},{"type":"extras","title":"Encryption - Deployment","doc":"Lightning enforces encryption at rest for credentials, TOTP backup codes, and\nwebhook trigger authentication methods, for which an encryption key must be\nprovided when running in production.\n\nThe key is expected to be a randomized set of bytes, 32 long; and Base64 encoded\nwhen setting the environment variable.\n\nThere is a mix task that can generate keys in the correct shape for use as an\nenvironment variable:\n\n```sh\nmix lightning.gen_encryption_key\n0bJ9w+hn4ebQrsCaWXuA9JY49fP9kbHmywGd5K7k+/s=\n```\n\nCopy your key _(NOT THIS ONE)_ and set it as `PRIMARY_ENCRYPTION_KEY` in your\nenvironment.","ref":"deployment.html#encryption"},{"type":"extras","title":"Workers - Deployment","doc":"Lightning uses external worker processes for executing Runs. There are three\nsettings required to configure worker authentication.\n\n- `WORKER_RUNS_PRIVATE_KEY`\n- `WORKER_LIGHTNING_PUBLIC_KEY`\n- `WORKER_SECRET`\n\nYou can use the `mix lightning.gen_worker_keys` task to generate these for\nconvenience.\n\nFor more information see the [Workers](WORKERS.md) documentation.","ref":"deployment.html#workers"},{"type":"extras","title":"Environment Variables - Deployment","doc":"Note that for secure deployments, it's recommended to use a combination of\n`secrets` and `configMaps` to generate secure environment variables.\n\n#","ref":"deployment.html#environment-variables"},{"type":"extras","title":"Limits - Deployment","doc":"- `WORKER_MAX_RUN_MEMORY_MB` - how much memory (in MB) can a single run use?\n- `RUN_GRACE_PERIOD_SECONDS` - how long _after_ the `MAX_RUN_DURATION_SECONDS`\n should the server wait for the worker to send back data on a run.\n- `WORKER_MAX_RUN_DURATION_SECONDS` - the maximum duration (in seconds) that\n workflows are allowed to run (keep this plus `RUN_GRACE_PERIOD_SECONDS` below\n your termination_grace_period if using kubernetes)\n- `WORKER_CAPACITY` - the number of runs a ws-worker instance will take on\n concurrently.\n- `MAX_DATACLIP_SIZE_MB` - the maximum size (in MB) of a dataclip created via\n the webhook trigger URL for a job. This limits the max request size via the\n JSON plug and may (in future) limit the size of dataclips that can be stored\n as run_results via the websocket connection from a worker.\n\n#","ref":"deployment.html#limits"},{"type":"extras","title":"Github - Deployment","doc":"Lightning enables connection to github via Github Apps. The following github\npermissions are needed for the github app:\n\n| **Resource** | **Access** |\n| ------------ | -------------- |\n| Actions | Read and Write |\n| Contents | Read and Write |\n| Metadata | Read only |\n| Secrets | Read and Write |\n| Workflows | Read and Write |\n\nEnsure you set the following URLs:\n* **Homepage URL:** ` `\n* **Callback URL for authorizing users:** ` /oauth/github/callback` (Do NOT check the two checkboxes in this section requesting Device Flow and OAuth.)\n* **Setup URL for Post installation:** ` /setup_vcs` (Check the box for **Redirect on update**)\n\nThese envrionment variables will need to be set in order to configure the github\napp:\n\n| **Variable** | **Description** |\n| -------------------------- | ---------------------------- |\n| `GITHUB_APP_ID` | the github app ID. |\n| `GITHUB_APP_NAME` | the github app name |\n| `GITHUB_APP_CLIENT_ID` | the github app Client ID |\n| `GITHUB_APP_CLIENT_SECRET` | the github app Client Secret |\n| `GITHUB_CERT` | the github app private key |\n\nYou can access these from your github app settings menu. Also needed for the\nconfigurtaion is:\n\n- `REPO_CONNECTION_SIGNING_SECRET` - secret used to sign access tokens. This\n access token is used to authenticate requests made from the github actions.\n You can generate this using `mix lightning.gen_encryption_key`\n\n#","ref":"deployment.html#github"},{"type":"extras","title":"Storage - Deployment","doc":"Lightning can use a storage backend to store exports.\n\n| **Variable** | Description |\n| ----------------- | ------------------------------------------------ |\n| `STORAGE_BACKEND` | the storage backend to use. (default is `local`) |\n| `STORAGE_PATH` | the path to store files in. (default is `.`) |\n\n##","ref":"deployment.html#storage"},{"type":"extras","title":"Supported backends: - Deployment","doc":"- `local` - local file storage\n- `gcs` - Google Cloud Storage\n\n##","ref":"deployment.html#supported-backends"},{"type":"extras","title":"Google Cloud Storage - Deployment","doc":"For Google Cloud Storage, the following environment variables are required:\n\n| **Variable** | Description |\n| ------------------------------------- | -------------------------------------------------------------------------------- |\n| `GCS_BUCKET` | the name of the bucket to store files in |\n| `GOOGLE_APPLICATION_CREDENTIALS_JSON` | A base64 encoded JSON keyfile for the service account with access to the bucket. |\n\n> ℹ️ Note: The `GOOGLE_APPLICATION_CREDENTIALS_JSON` should be base64 encoded,\n> currently Workload Identity is not supported.\n\n#","ref":"deployment.html#google-cloud-storage"},{"type":"extras","title":"Other config - Deployment","doc":"| **Variable** | Description |\n| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `ADAPTORS_PATH` | Where you store your locally installed adaptors |\n| `ALLOW_SIGNUP` | Set to `true` to enable user access to the registration page. Set to `false` to disable new user registrations and block access to the registration page. Default is `true`. |\n| `CORS_ORIGIN` | A list of acceptable hosts for browser/cors requests (',' separated) |\n| `DISABLE_DB_SSL` | In production, the use of an SSL connection to Postgres is required by default. Setting this to `\"true\"` allows unencrypted connections to the database. This is strongly discouraged in a real production environment. |\n| `EMAIL_ADMIN` | This is used as the sender email address for system emails. It is also displayed in the menu as the support email. |\n| `EMAIL_SENDER_NAME` | This is displayed in the email client as the sender name for emails sent by the application. |\n| `IDLE_TIMEOUT` | The number of seconds that must pass without data being received before the Lightning web server kills the connection. |\n| `IS_RESETTABLE_DEMO` | If set to `yes`, it allows this instance to be reset to the initial \"Lightning Demo\" state. Note that this will destroy _most_ of what you have in your database! |\n| `K8S_HEADLESS_SERVICE` | This environment variable is automatically set if you're running on GKE and it is used to establish an Erlang node cluster. Note that if you're _not_ using Kubernetes, the \"gossip\" strategy is used to establish clusters. |\n| `LISTEN_ADDRESS` | The address the web server should bind to. Defaults to `127.0.0.1` to block access from other machines. |\n| `LOG_LEVEL` | How noisy you want the logs to be (e.g., `debug`, `info`) |\n| `MIX_ENV` | Your mix env, likely `prod` for deployment |\n| `NODE_ENV` | Node env, likely `production` for deployment |\n| `ORIGINS` | The allowed origins for web traffic to the backend |\n| `PORT` | The port your Phoenix app runs on |\n| `PRIMARY_ENCRYPTION_KEY` | A base64 encoded 32 character long string. See [Encryption](#encryption). |\n| `QUEUE_RESULT_RETENTION_PERIOD_SECONDS` | The number of seconds to keep completed (successful) `ObanJobs` in the queue (not to be confused with runs and/or history) |\n| `SCHEMAS_PATH` | Path to the credential schemas that provide forms for different adaptors |\n| `SECRET_KEY_BASE` | A secret key used as a base to generate secrets for encrypting and signing data. |\n| `SENTRY_DSN` | If using Sentry for error monitoring, your DSN |\n| `URL_HOST` | The host used for writing URLs (e.g., `demo.openfn.org`) |\n| `URL_PORT` | The port, usually `443` for production |\n| `URL_SCHEME` | The scheme for writing URLs (e.g., `https`) |\n| `USAGE_TRACKER_HOST` | The host that receives usage tracking submissions (defaults to https://impact.openfn.org) |\n| `USAGE_TRACKING_DAILY_BATCH_SIZE` | The number of days that will be reported on with each run of `UsageTracking.DayWorker`. This will only have a noticeable effect in cases where there is a backlog or where reports are being generated retroactively (defaults to 10). |\n| `USAGE_TRACKING_ENABLED` | Enables the submission of anonymized usage data to OpenFn (defaults to `true`) |\n| `USAGE_TRACKING_RESUBMISSION_BATCH_SIZE` | The number of failed reports that will be submitted on each resubmission run (defaults to 10) |\n| `USAGE_TRACKING_UUIDS` | Indicates whether submissions should include cleartext UUIDs or not. Options are `cleartext` or `hashed_only`, with the default being `hashed_only`. |\n\n#","ref":"deployment.html#other-config"},{"type":"extras","title":"AI Chat - Deployment","doc":"🧪 **Experimental**\n\nLightning can be configured to use an AI chatbot for user interactions.\n\nSee [openfn/apollo](https://github.com/OpenFn/apollo) for more information on\nthe Apollo AI service.\n\nThe following environment variables are required:\n\n- `OPENAI_API_KEY` - your OpenAI API key.\n- `APOLLO_ENDPOINT` - the endpoint for the OpenFn Apollo AI service.\n\n#","ref":"deployment.html#ai-chat"},{"type":"extras","title":"Kafka Triggers - Deployment","doc":"🧪 **Experimental**\n\nLightning workflows can be configured with a trigger that will consume messages\nfrom a Kafka Cluster. By default this is disabled and you will not see the\noption to create a Kafka trigger in the UI, nor will the Kafka consumer groups\nbe running.\n\nTo enable this feature set the `KAFKA_TRIGGERS_ENABLED` environment variable to\n`yes` and restart Lightning. Please note that, if you enable this feature and\nthen create some Kafka triggers and then disable the feature, you will not be\nable to edit any triggers created before the feature was disabled.\n\n##","ref":"deployment.html#kafka-triggers"},{"type":"extras","title":"Performance Tuning - Deployment","doc":"The number of Kafka consumers in the consumer group can be modified by setting\nthe `KAFKA_NUMBER_OF_CONSUMERS` environment variable. The default value is\ncurrently 1. The optimal setting is one consumer per topic partition. NOTE: This\nsetting will move to KafkaConfiguration as it will be trigger-specific.\n\nThe number of messages that the Kafka consumer will forward is rate-limited by\nthe `KAFKA_NUMBER_OF_MESSAGES_PER_SECOND` environment variable. This can be set\nto a value of less than 1 (minimum 0.1) and will converted (and rounded-down) to\nan integer value of messages over a 10-second interval (e.g. 0.15 becomes 1\nmessage every 10 seconds). The default value is 1.\n\nProcessing concurrency within the Kafka Broadway pipeline is controlled by the\n`KAFKA_NUMBER_OF_PROCESSORS` environment variable. Modifying this, modifies the\nnumber of processors that are downstream of the Kafka consumer, so an increase\nin this value should increase throughput (when factoring in the rate limit set\nby `KAFKA_NUMBER_OF_MESSAGES_PER_SECOND`). The default value is 1.\n\n##","ref":"deployment.html#performance-tuning"},{"type":"extras","title":"Deduplication - Deployment","doc":"Each Kafka trigger maintains record of the topic, parition and offset for each\nmessage received. This to protect against the ingestion of duplicate messages\nfrom the cluster. These records are periodically cleaned out. The duration for\nwhich they are retained is controlled by\n`KAFKA_DUPLICATE_TRACKING_RETENTION_SECONDS`. The default value is 3600.\n\n##","ref":"deployment.html#deduplication"},{"type":"extras","title":"Disabling Kafka Triggers - Deployment","doc":"After a Kafka consumer group connects to a Kafka cluster, the cluster will track\nthe last committed offset for a given consumer group ,to ensure that the consumer\ngroup receives the correct messages.\n\nThis data is retained for a finite period. If an enabled Kafka trigger is \ndisabled for longer than the offset retention period the consumer group offset\ndata will be cleared.\n\nIf the Kafka trigger is re-enabled after the offset data has been cleared, this\nwill result in the consumer group reverting to what has been configured as the\n'Initial offset reset policy' for the trigger. This may result in the\nduplication of messages or even data loss.\n\nIt is recommended that you check the value of the `offsets.retention.minutes` for\nthe Kafka cluster to determine what the cluster's retention period is, and\nconsider this when disabling a Kafka trigger for an extended period.\n\n#","ref":"deployment.html#disabling-kafka-triggers"},{"type":"extras","title":"Google Oauth2 - Deployment","doc":"Using your Google Cloud account, provision a new OAuth 2.0 Client with the 'Web\napplication' type.\n\nSet the callback url to: `https:// /authenticate/callback`.\nReplacing `ENDPOINT DOMAIN` with the host name of your instance.\n\nOnce the client has been created, get/download the OAuth client JSON and set the\nfollowing environment variables:\n\n| **Variable** | Description |\n| ---------------------- | --------------------------------------------- |\n| `GOOGLE_CLIENT_ID` | Which is `client_id` from the client details. |\n| `GOOGLE_CLIENT_SECRET` | `client_secret` from the client details. |\n\n#","ref":"deployment.html#google-oauth2"},{"type":"extras","title":"Salesforce Oauth2 - Deployment","doc":"Using your Salesforce developer account, create a new Oauth 2.0 connected\napplication.\n\nSet the callback url to: `https:// /authenticate/callback`.\nReplacing `ENDPOINT DOMAIN` with the host name of your instance.\n\nGrant permissions as desired.\n\nOnce the client has been created set the following environment variables:\n\n| **Variable** | Description |\n| -------------------------- | --------------------------------------------------------------------- |\n| `SALESFORCE_CLIENT_ID` | Which is `Consumer Key` from the \"Manage Consumer Details\" screen. |\n| `SALESFORCE_CLIENT_SECRET` | Which is `Consumer Secret` from the \"Manage Consumer Details\" screen. |","ref":"deployment.html#salesforce-oauth2"},{"type":"extras","title":"Benchmarking","doc":"# Benchmarking","ref":"benchmarking.md.html"},{"type":"extras","title":"Run benchmarking tests against the demo webhook - Benchmarking","doc":"Execute the following steps to run a benchmark on Lightning:\n\n1. Make sure you have [k6](https://k6.io/docs/get-started/installation/)\n installed locally. If you're using `asdf` you can run `asdf install` in the\n project root.\n\n2. Start up a local Lightning instance with an attached iex session. Note that\n to simulate a production environment, set `RTM=false`. In prod, you'll have\n your `ws-worker` running on a separate machine:\n\n `RMT=false iex -S mix phx.server`\n\n3. In the attached iex session, run the following, to have Lightning log\n internal telemetry data:\n\n ```elixir\n filepath = Path.join(\"benchmarking\", \"load_test_data.csv\")\n output_file = File.open!(filepath, [:append])\n\n c \"benchmarking/load_test_production_spans.exs\"\n\n LoadTestingPrep.init(output_file)\n ```\n\n4. Run the demo setup script: `mix run --no-start priv/repo/demo.exs` The\n `webhookURL` is already set to default to the webhook created in the demo\n data\n\n If you would like to point at a different instance or webhook url you\n can provide it via `WEBHOOK_URL`.\n\n5. In another terminal (do not stop the Lightning server) run the\n `benchmarking/script.js` file using the following command\n\n ```bash\n k6 run benchmarking/script.js\n ```\n\n If the script exits successfully, this means the app met the defined\n performance thresholds.\n\n By default, the test payload is just 2 kb. Should you wish to test it with\n larger payloads, you can pass in the `PAYLOAD_SIZE_KB` ENV variable. This\n variable allows you to specify the payload size in KB (for now, integer\n values only), (e.g. 2 KB):\n\n ```bash\n k6 run -e PAYLOAD_SIZE_KB=2 benchmarking/script.js\n ```\n\n To collect the benchmarking data in a CSV file, run the previous command with\n the `--out filename` option.\n\n ```bash\n k6 run --out csv=test_results.csv benchmarking/script.js\n ```\n\n6. In the iex session, close the output file:\n\n ```elixir\n LoadTestingPrep.fin(output_file)\n ```\n\nSee [results output](https://k6.io/docs/get-started/results-output/) for other\navailable output formats.\n\n#","ref":"benchmarking.md.html#run-benchmarking-tests-against-the-demo-webhook"},{"type":"extras","title":"Sample benchmarks - Benchmarking","doc":"##","ref":"benchmarking.md.html#sample-benchmarks"},{"type":"extras","title":"System specs on a 2020 MacBook Pro - Benchmarking","doc":"```\nModel Name: MacBook Pro\nModel Identifier: MacBookPro17,1\nModel Number: Z11B000E3LL/A\nChip: Apple M1\nTotal Number of Cores: 8 (4 performance and 4 efficiency)\nMemory: 16 GB\n```\n\n##","ref":"benchmarking.md.html#system-specs-on-a-2020-macbook-pro"},{"type":"extras","title":"Results with 50kb payloads - Benchmarking","doc":"```\nk6 run -e PAYLOAD_SIZE=10 benchmarking/script.js Node 18.17.1 k6 0.43.1 07:40:29\n\n /\\ |‾‾| /‾‾/ /‾‾/\n /\\ / \\ | |/ / / /\n / \\/ \\ | ( / ‾‾\\\n / \\ | |\\ \\ | (‾) |\n / __________ \\ |__| \\__\\ \\_____/ .io\n\n execution: local\n script: benchmarking/script.js\n output: -\n\n scenarios: (100.00%) 1 scenario, 50 max VUs, 2m50s max duration (incl. graceful stop):\n * webhookRequests: Up to 50.00 iterations/s for 2m20s over 3 stages (maxVUs: 50, gracefulStop: 30s)\n\n\n ✓ status was 200\n\n █ setup\n\n checks.........................: 100.00% ✓ 5765 ✗ 0\n data_received..................: 1.6 MB 12 kB/s\n data_sent......................: 59 MB 421 kB/s\n http_req_blocked...............: avg=16.01µs min=2µs med=9µs max=6.84ms p(90)=12µs p(95)=13µs\n http_req_connecting............: avg=4.35µs min=0s med=0s max=2.22ms p(90)=0s p(95)=0s\n ✓ http_req_duration..............: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms\n { expected_response:true }...: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms\n ✓ http_req_failed................: 0.00% ✓ 0 ✗ 5765\n http_req_receiving.............: avg=88.57µs min=13µs med=90µs max=2.99ms p(90)=108µs p(95)=124.8µs\n http_req_sending...............: avg=97.47µs min=29µs med=83µs max=6.86ms p(90)=139µs p(95)=162µs\n http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s\n http_req_waiting...............: avg=53.44ms min=26.68ms med=48.84ms max=501.43ms p(90)=66.43ms p(95)=84.05ms\n http_reqs......................: 5765 41.15402/s\n iteration_duration.............: avg=54.34ms min=20.75µs med=49.75ms max=502.26ms p(90)=67.39ms p(95)=84.91ms\n iterations.....................: 5765 41.15402/s\n vus............................: 50 min=50 max=50\n vus_max........................: 50 min=50 max=50\n\n\nrunning (2m20.1s), 00/50 VUs, 5765 complete and 0 interrupted iterations\nwebhookRequests ✓ [======================================] 00/50 VUs 2m20s 01.12 iters/s\n```","ref":"benchmarking.md.html#results-with-50kb-payloads"},{"type":"extras","title":"Run load tests for a hypothetical cold chain system - Benchmarking","doc":"`benchmarking/sample_cold_chain_monitoring_script.js` contains a k6 script that\ncan be used to simulate data from a hypothetical cold chain system. It requires a\ncustom job to be created (an example of which can be found at the top of the\nscript file).\n\nThe test can be excuted as follows (`WEBHOOK_URL` is not optional):\n\n```bash\n WEBHOOK_URL=... k6 run benchmarking/sample_cold_chain_monitoring_script.js\n```","ref":"benchmarking.md.html#run-load-tests-for-a-hypothetical-cold-chain-system"},{"type":"extras","title":"Workers","doc":"# Workers\n\nThe OpenFn Runtime used by Lightning is a [Node.js](https://nodejs.org/en/)\napplication that runs on a server. It is responsible for executing the code that\nyou write in your OpenFn jobs.\n\nA Runtime Manager is a module or application that processes Runs, which\ncontains reference to the Workflow, the starting point and the initial data.\n\nRuns are enqueued, and Runtime Managers request work to be performed when\nthey are ready.","ref":"workers.html"},{"type":"extras","title":"History - Workers","doc":"In previous versions of OpenFn products, the server would invoke a NodeJS child\nprocess for each Run that needs to be executed. Deciding which Job to run in a\nworkflow is decided after each run is completed.\n\nThe current approach to executing Runs, is that a worker checks out the\nentire run and executes it and all the jobs required.\n\nThe advantage of this approach is a significant reduction in latency of\nlaunching new workers for every Run to be processed.","ref":"workers.html#history"},{"type":"extras","title":"Connecting Workers to Lightning - Workers","doc":"Our standard Runtime Manager uses WebSockets to communicate with Lightning.\n\nHowever, since the workers are treated no differently from any other incoming\ntraffic; there are two layers of security applied to anything that can access\nyour data or process work.\n\nWe use two different JWTs to facilitate the follow:\n\n#","ref":"workers.html#connecting-workers-to-lightning"},{"type":"extras","title":"Worker Token - Workers","doc":"This token is created by the worker and signed with a shared HS256 secret that\nLightning uses to verify.\n\n#","ref":"workers.html#worker-token"},{"type":"extras","title":"Run Token - Workers","doc":"This token is created by Lightning for every Run that a worker receives. The\ntoken is signed with a private key, and therefore cannot be generated by 3rd\nparties.\n\nThe token is scoped for a single Run and cannot be used to access anything\noutside of the scope of that Run.","ref":"workers.html#run-token"},{"type":"extras","title":"Generating Keys - Workers","doc":"Lightning comes with a mix task to help generate keys:\n\n```\nmix lightning.gen_worker_keys\n```","ref":"workers.html#generating-keys"},{"type":"extras","title":"Configuring Lightning and Workers - Workers","doc":"There are three environment variables required to make everything work.\n\n**`WORKER_RUNS_PRIVATE_KEY`**\n\n_Lightning only_\n\nA Base64 encoded private key in PEM format, used to generate JWTs granting\nworkers permission to access a specific Run, the related Workflow and\ncredentials.\n\n> [!IMPORTANT] This key should never be shared. If you suspect it has been\n> compromised, generate a new one and reconfigure both Lightning and your\n> workers.\n\n**`WORKER_SECRET`**\n\n_Lightning and Workers_\n\nA 256bit long shared secret used by the worker to sign JWTs for authentication\nwith the Lightning API.\n\n**`WORKER_LIGHTNING_PUBLIC_KEY`**\n\n_Workers only_\n\nA Base64 encoded public key in PEM format derived from the private key. This is\nused by workers to verify Run Tokens coming from Lightning.","ref":"workers.html#configuring-lightning-and-workers"},{"type":"extras","title":"Troubleshooting - Workers","doc":"#","ref":"workers.html#troubleshooting"},{"type":"extras","title":"Problems with NodeJS DNS name resolution - Workers","doc":"NodeJS v17 [changed](https://github.com/nodejs/node/pull/39987) how DNS name\nresolution is handled. In earlier versions, Node would reorder DNS lookup\nresults so IPv4 addresses came before IPv6 addresses. In v17, Node started\nreturning addresses in the same order provided by the resolver. The net effect\nis that your workers might fail to connect to Lightning if the native DNS\nresolver on your system is returning the loopback IPv6 address (`::1`) before\nthe IPv4 address (`127.0.0.1`). In these cases, your worker might report an\nerror similar to the following:\n\n```\nCRITICAL ERROR: could not connect to lightning at ws://localhost:4000/worker\n```\n\nIf you experience this, it can be helpful to set the `NODE_OPTIONS` environment\nvariable as shown below. This will force pre-v17 behavior of returning IPv4\naddresses first.\n\n```\nNODE_OPTIONS=--dns-result-order=ipv4first\n```\n\nYou can directly inspect what IP address Node returns for `localhost` by running\nthe following command:\n\n```\nnode -e 'dns.lookup(\"localhost\", console.log)'\n```","ref":"workers.html#problems-with-nodejs-dns-name-resolution"},{"type":"extras","title":"Provisioning","doc":"# Provisioning\n\nLightning offers the ability to configure projects via the HTTP API.\n\nBy providing a JSON document with the desired configuration, the project can be\nconfigured to your liking.","ref":"provisioning.html"},{"type":"extras","title":"Using the API - Provisioning","doc":"The API is available at `/api/provision`, and expects an `application/json`\nContent-Type.\n\n#","ref":"provisioning.html#using-the-api"},{"type":"extras","title":"Authentication - Provisioning","doc":"The API requires a valid auth token to be provided in the `Authorization`\nheader.\n\n#","ref":"provisioning.html#authentication"},{"type":"extras","title":"Example Request - Provisioning","doc":"```bash\n curl -X POST \\\n -d @project.json \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n $ENDPOINT/api/provision\n```","ref":"provisioning.html#example-request"},{"type":"extras","title":"Document Structure - Provisioning","doc":"The provisioning document is a JSON document with the project at the root.\n\n> All entities **must have** an `id` field, which is a UUIDv4 string. In the\n> case of new entities, this must be generated by the client.\n\nThe API is idempotent, and the distinction between creating and updating is\ndetermined by the presence of the `id` field.\n\n```jsonc\n{\n \"id\": \" >\",\n \"name\": \" >\",\n \"workflows\": [\n {\n \"id\": \" >\",\n \"name\": \" >\",\n \"jobs\": [\n {\n \"id\": \" >\",\n \"name\": \" >\",\n \"body\": \" >\",\n \"adaptor\": \" >\",\n \"enabled\": true\n }\n // ... more jobs\n ],\n \"triggers\": [\n {\n \"id\": \" >\",\n \"name\": \" >\",\n \"type\": \"webhook\"\n }\n // ... more triggers\n ],\n \"edges\": [\n {\n \"id\": \" >\",\n \"source_trigger_id\": \" >\",\n \"target_job_id\": \" >\"\n }\n // ... more edges\n ]\n }\n // ... more workflows\n ]\n}\n```","ref":"provisioning.html#document-structure"},{"type":"extras","title":"API Behaviour - Provisioning","doc":"The API expects **all** existing entities to be provided in the provisioning\ndocument.\n\nIf the document provided is out of date (e.g. a new job was added on the\nserver), a new reference document should be fetched and the changes applied to\nit.\n\n#","ref":"provisioning.html#api-behaviour"},{"type":"extras","title":"Deleting Entities - Provisioning","doc":"Entities can be deleted by setting the `disabled` key to `true`.\n\nExample:\n\n```jsonc\n{\n \"id\": \" >\",\n \"workflows\": [\n {\n \"id\": \" >\",\n \"jobs\": [\n {\n \"id\": \" >\",\n \"delete\": true // <== delete this job\n }\n ]\n }\n ]\n}\n```","ref":"provisioning.html#deleting-entities"},{"type":"extras","title":"Relationship with Projects as Code - Provisioning","doc":"The Projects as Code spec is a superset of the provisioning API.\n\nProjects as Code allows for the user to specify a key for each entity, which\nmakes it easier to manage the project in the future.\n\nFor example:\n\n```yaml\nname: my-project\nworkflows:\n workflow-one:\n jobs:\n job-one:\n body: |\n console.log(\"Hello World\");\n adaptor: '@openfn/language-common'\n enabled: true\n triggers:\n trigger-one:\n type: webhook\n edges:\n - source_trigger: trigger-one\n target_job: job-one\n```\n\nThe above YAML document illustrates the use of keys being used to identify\nentities. Allowing the user to provision the same project to multiple\nenvironments.\n\nThe API is unaware of 'keys', and expects IDs to be provided by the client.\n\nIn order to convert the above YAML document to a provisioning document, the CLI\nuses a local state file (if available) to map the keys to UUIDs.\n\nUsing the example above a state file might look like this:\n\n```jsonc\n{\n \"id\": \"f6ba9a8c-b687-473a-908e-e250686f1eed\",\n \"workflows\": {\n \"workflow-one\": {\n \"id\": \"f206aa85-4fce-492e-94eb-ffd32c75d178\",\n \"jobs\": {},\n \"triggers\": {}\n }\n }\n}\n```\n\nThe state file shows that the project and workflow already exist, but the job,\ntrigger and edge do not. In order to create these new entities, IDs will be\napplied them.\n\nOn a successful application of the provisioning document, the state file will be\nupdated to reflect the new IDs and entities.\n\n```json\n{\n \"id\": \"f6ba9a8c-b687-473a-908e-e250686f1eed\",\n \"workflows\": {\n \"workflow-one\": {\n \"id\": \"f206aa85-4fce-492e-94eb-ffd32c75d178\",\n \"jobs\": {\n \"job-one\": { \"id\": \"18ed71de-caf8-4822-aefc-5b19351f4016\" }\n },\n \"triggers\": {\n \"trigger-one\": { \"id\": \"e0b9f357-9cf9-4206-9924-4d5674aad830\" }\n },\n \"edges\": [\n {\n \"id\": \"c239d994-6662-4637-90f8-0293c924b461\",\n \"source_trigger_id\": \"e0b9f357-9cf9-4206-9924-4d5674aad830\",\n \"target_job_id\": \"18ed71de-caf8-4822-aefc-5b19351f4016\"\n }\n ]\n }\n }\n}\n```","ref":"provisioning.html#relationship-with-projects-as-code"},{"type":"extras","title":"Changelog","doc":"# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n- `Added` for new features.\n- `Changed` for changes in existing functionality.\n- `Deprecated` for soon-to-be removed features.\n- `Removed` for now removed features.\n- `Fixed` for any bug fixes.\n- `Security` in case of vulnerabilities.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to\n[Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n#","ref":"changelog.html"},{"type":"extras","title":"Added - Changelog","doc":"#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Make project description multiline in project.yaml\n [#2534](https://github.com/OpenFn/lightning/issues/2534)\n- Do not track partition timestamps when ingesting Kafka messages.\n [#2531](https://github.com/OpenFn/lightning/issues/2531)\n- Always use the `initial_offset_reset_policy` when enabling a Kafka pipeline.\n [#2531](https://github.com/OpenFn/lightning/issues/2531)\n- Add plumbing to simulate a persistence failure in a Kafka trigger pipeline.\n [#2386](https://github.com/OpenFn/lightning/issues/2386)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix Oban erros not getting logged in Sentry\n [#2542](https://github.com/OpenFn/lightning/issues/2542)\n- Perform data retention purging in batches to avoid timeouts\n [#2528](https://github.com/OpenFn/lightning/issues/2528)\n- Mark unfinished steps having finished runs as `lost`\n [#2416](https://github.com/OpenFn/lightning/issues/2416)\n\n## [v2.9.8] - 2024-10-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Ability for users to to retry Runs and create manual Work Orders from the job\n inspector #2496 [#2496](https://github.com/OpenFn/lightning/issues/2496)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix panel icons overlays on top title when collapsed\n [#2537](https://github.com/OpenFn/lightning/issues/2537)\n\n## [v2.9.7] - 2024-10-02\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Enqueues many work orders retries in the same transaction per Oban job.\n [#2363](https://github.com/OpenFn/lightning/issues/2363)\n- Added the ability to retry rejected work orders.\n [#2391](https://github.com/OpenFn/lightning/issues/2391)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Notify other present users when the promoted user saves the workflow\n [#2282](https://github.com/OpenFn/lightning/issues/2282)\n- User email change: Add debounce on blur to input forms to avoid validation\n after every keystroke [#2365](https://github.com/OpenFn/lightning/issues/2365)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Use timestamps sent from worker when starting and completing runs\n [#2434](https://github.com/OpenFn/lightning/issues/2434)\n- User email change: Add debounce on blur to input forms to avoid validation\n after every keystroke [#2365](https://github.com/OpenFn/lightning/issues/2365)\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- User email change: Send notification of change to the old email address and\n confirmation to the new email address\n [#2365](https://github.com/OpenFn/lightning/issues/2365)\n- Fixes filters to properly handle the \"rejected\" status for work orders.\n [#2391](https://github.com/OpenFn/lightning/issues/2391)\n- Fix item selection (project / billing account) in the context switcher\n [#2518](https://github.com/OpenFn/lightning/issues/2518)\n- Export edge condition expressions as multiline in project spec\n [#2521](https://github.com/OpenFn/lightning/issues/2521)\n- Fix line spacing on AI Assistant\n [#2498](https://github.com/OpenFn/lightning/issues/2498)\n\n## [v2.9.6] - 2024-09-23\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Increase minimum password length to 12 in accordance with ASVS 4.0.3\n recommendation V2.1.2 [#2507](https://github.com/OpenFn/lightning/pull/2507)\n- Changed the public sandbox (https://demo.openfn.org) setup script to use\n `welcome12345` passwords to comply with a 12-character minimum\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Dataclip selector always shows that the dataclip is wiped even when the job\n wasn't run [#2303](https://github.com/OpenFn/lightning/issues/2303)\n- Send run channel errors to sentry\n [#2515](https://github.com/OpenFn/lightning/issues/2515)\n\n## [v2.9.5] - 2024-09-18\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Hide export history button when no workorder is rendered in the table\n [#2440](https://github.com/OpenFn/lightning/issues/2440)\n- Improve docs for running lightning locally #2499\n [#2499](https://github.com/OpenFn/lightning/pull/2499)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix empty webhook URL when switching workflow trigger type\n [#2050](https://github.com/OpenFn/lightning/issues/2050)\n- Add quotes when special YAML characters are present in the exported project\n [#2446](https://github.com/OpenFn/lightning/issues/2446)\n- In the AI Assistant, don't open the help page when clicking the Responsible AI\n Link [#2511](https://github.com/OpenFn/lightning/issues/2511)\n\n## [v2.9.4] - 2024-09-16\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Responsible AI review of AI Assistant\n [#2478](https://github.com/OpenFn/lightning/pull/2478)\n- Improve history export page UI\n [#2442](https://github.com/OpenFn/lightning/issues/2442)\n- When selecting a node in the workflow diagram, connected edges will also be\n highlighted [#2396](https://github.com/OpenFn/lightning/issues/2358)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix AI Assitant crashes on a job that is not saved yet\n [#2479](https://github.com/OpenFn/lightning/issues/2479)\n- Fix jumpy combobox for scope switcher\n [#2469](https://github.com/OpenFn/lightning/issues/2469)\n- Fix console errors when rending edge labels in the workflow diagram\n- Fix tooltip on export workorder button\n [#2430](https://github.com/OpenFn/lightning/issues/2430)\n\n## [v2.9.3] - 2024-09-11\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add utility module to seed a DB to support query performance analysis.\n [#2441](https://github.com/OpenFn/lightning/issues/2441)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Enhance user profile page to add a section for updating basic information\n [#2470](https://github.com/OpenFn/lightning/pull/2470)\n- Upgraded Heroicons to v2.1.5, from v2.0.18\n [#2483](https://github.com/OpenFn/lightning/pull/2483)\n- Standardize `link-uuid` style for uuid chips\n- Updated PromEx configuration to align with custom Oban naming.\n [#2488](https://github.com/OpenFn/lightning/issues/2488)\n\n## [v2.9.2] - 2024-09-09\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Temporarily limit AI to @openfn emails while testing\n [#2482](https://github.com/OpenFn/lightning/pull/2482)\n\n## [v2.9.1] - 2024-09-09\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Provisioner creates invalid snapshots when doing CLI deploy\n [#2461](https://github.com/OpenFn/lightning/issues/2461)\n [#2460](https://github.com/OpenFn/lightning/issues/2460)\n\n > This is a fix for future Workflow updates that are deployed by the CLI and\n > Github integrations. Unfortunately, there is a high likelihood that your\n > existing snapshots could be incorrect (e.g. missing steps, missing edges).\n > In order to fix this, you will need to manually create new snapshots for\n > each of your workflows. This can be done either by modifying the workflow in\n > the UI and saving it. Or running a command on the running instance:\n >\n > ```elixir\n > alias Lightning.Repo\n > alias Lightning.Workflows.{Workflow, Snapshot}\n >\n > Repo.transaction(fn ->\n > snapshots =\n > Repo.all(Workflow)\n > |> Enum.map(&Workflow.touch/1)\n > |> Enum.map(&Repo.update!/1)\n > |> Enum.map(fn workflow ->\n > {:ok, snapshot} = Snapshot.create(workflow)\n > snapshot\n > end)\n >\n > {:ok, snapshots}\n > end)\n > ```\n\n## [v2.9.0] - 2024-09-06\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Limit AI queries and hook the increment of AI queries to allow usage limiting.\n [#2438](https://github.com/OpenFn/lightning/pull/2438)\n- Persist AI Assistant conversations and enable it for all users\n [#2296](https://github.com/OpenFn/lightning/issues/2296)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Rename `new_table` component to `table`.\n [#2448](https://github.com/OpenFn/lightning/pull/2448)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix `workflow_id` presence in state.json during Github sync\n [#2445](https://github.com/OpenFn/lightning/issues/2445)\n\n## [v2.8.2] - 2024-09-04\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Change navbar colors depending on scope.\n [#2449](https://github.com/OpenFn/lightning/pull/2449)\n- Add support for configurable idle connection timeouts via the `IDLE_TIMEOUT`\n environment variable. [#2443](https://github.com/OpenFn/lightning/issues/2443)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Allow setup_user command to be execute from outside the container with\n `/app/bin/lightning eval Lightning.Setup.setup_user/3`\n- Implement a combo-box to make navigating between projects easier\n [#241](https://github.com/OpenFn/lightning/pull/2424)\n- Updated vulnerable version of micromatch.\n [#2454](https://github.com/OpenFn/lightning/issues/2454)\n\n## [v2.8.1] - 2024-08-28\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Improve run claim query by removing extraneous sorts\n [#2431](https://github.com/OpenFn/lightning/issues/2431)\n\n## [v2.8.0] - 2024-08-27\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Users are now able to export work orders, runs, steps, logs, and dataclips\n from the History page.\n [#1698](https://github.com/OpenFn/lightning/issues/1698)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Add index over `run_id` and `step_id` in run_steps to improve worker claim\n speed. [#2428](https://github.com/OpenFn/lightning/issues/2428)\n- Show Github Error messages as they are to help troubleshooting\n [#2156](https://github.com/OpenFn/lightning/issues/2156)\n- Allow `Setup_utils.setup_user` to be used for the initial superuser creation.\n- Update to code assist in the Job Editor to import namespaces from adaptors.\n [#2432](https://github.com/OpenFn/lightning/issues/2432)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Unable to remove/reconnect github app in lightning after uninstalling directly\n from Github [#2168](https://github.com/OpenFn/lightning/issues/2168)\n- Github sync buttons available even when usage limiter returns error\n [PR#2390](https://github.com/OpenFn/lightning/pull/2390)\n- Fix issue with the persisting of a Kafka message with headers.\n [#2402](https://github.com/OpenFn/lightning/issues/2402)\n- Protect against race conditions when updating partition timestamps for a Kafka\n trigger. [#2378](https://github.com/OpenFn/lightning/issues/2378)\n\n## [v2.7.19] - 2024-08-19\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Pass the user_id param on check usage limits.\n [#2387](https://github.com/OpenFn/lightning/issues/2387)\n\n## [v2.7.18] - 2024-08-17\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Added - Changelog","doc":"- Ensure that all users in an instance have a confirmed email address within 48\n hours [#2389](https://github.com/OpenFn/lightning/issues/2389)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Ensure that all the demo accounts are confirmed by default\n [#2395](https://github.com/OpenFn/lightning/issues/2395)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Removed all Kafka trigger code that ensured that message sequence is honoured\n for messages with keys. Functionality to ensure that message sequence is\n honoured will be added in the future, but in an abstraction that is a better\n fit for the current Lightning design.\n [#2362](https://github.com/OpenFn/lightning/issues/2362)\n- Dropped the `trigger_kafka_messages` table that formed part of the Kafka\n trigger implementation, but which is now obsolete given the removal of the\n code related to message sequence preservation.\n [#2362](https://github.com/OpenFn/lightning/issues/2362)\n\n## [v2.7.17] - 2024-08-14\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added an `iex` command to setup a user, an apiToken, and credentials so that\n it's possible to get a fully running lightning instance via external shell\n script. (This is a tricky requirement for a distributed set of local\n deployments) [#2369](https://github.com/OpenFn/lightning/issues/2369) and\n [#2373](https://github.com/OpenFn/lightning/pull/2373)\n- Added support for _very basic_ project-credential management (add, associate\n with job) via provisioning API.\n [#2367](https://github.com/OpenFn/lightning/issues/2367)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Enforced uniqueness on credential names _by user_.\n [#2371](https://github.com/OpenFn/lightning/pull/2371)\n- Use Swoosh to format User models into recipients\n [#2374](https://github.com/OpenFn/lightning/pull/2374)\n- Bump default CLI to `@openfn/cli@1.8.1`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- When a Workflow is deleted, any associated Kafka trigger pipelines will be\n stopped and deleted. [#2379](https://github.com/OpenFn/lightning/issues/2379)\n\n## [v2.7.16] - 2024-08-07\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- @ibrahimwickama fixed issue that prevented users from creating new workflows\n if they are running in an `http` environment (rather than `localhost` or\n `https`). [#2365](https://github.com/OpenFn/lightning/pull/2356)\n\n## [v2.7.15] - 2024-08-07\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Kafka messages without keys are synchronously converted into a Workorder,\n Dataclip and Run. Messages with keys are stored as TriggerKafkaMessage\n records, however the code needed to process them has been disabled, pending\n removal. [#2351](https://github.com/OpenFn/lightning/issues/2351)\n\n## [v2.7.14] - 2024-08-05\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Use standard styles for link, fix home button in breadcrumbs\n [#2354](https://github.com/OpenFn/lightning/pull/2354)\n\n## [v2.7.13] - 2024-08-05\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Don't log 406 Not Acceptable errors to Sentry\n [#2350](https://github.com/OpenFn/lightning/issues/2350)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Correctly handle floats in LogMessage\n [#2348](https://github.com/OpenFn/lightning/issues/2348)\n\n## [v2.7.12] - 2024-07-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Make root layout configurable\n [#2310](https://github.com/OpenFn/lightning/pull/2310)\n- Use snapshots when initiating Github Sync\n [#1827](https://github.com/OpenFn/lightning/issues/1827)\n- Move runtime logic into module\n [#2338](https://github.com/OpenFn/lightning/pull/2338)\n- Use `AccountHook Extension` to register new users invited in a project\n [#2341](https://github.com/OpenFn/lightning/pull/2341)\n- Standardized top bars across the UI with a navigable breadcrumbs interface\n [#2299](https://github.com/OpenFn/lightning/pull/2299)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Limit frame size of worker socket connections\n [#2339](https://github.com/OpenFn/lightning/issues/2339)\n- Limit number of days to 31 in cron trigger dropdown\n [#2331](https://github.com/OpenFn/lightning/issues/2331)\n\n## [v2.7.11] - 2024-07-26\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Expose more Kafka configuration at instance-level.\n [#2329](https://github.com/OpenFn/lightning/issues/2329)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Table action css tweaks\n [#2333](https://github.com/OpenFn/lightning/issues/2333)\n\n## [v2.7.10]\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- A rudimentary optimisation for Kafka messages that do not have a key as the\n sequence of these messages can not be guaranteed.\n [#2323](https://github.com/OpenFn/lightning/issues/2323)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix an intermittent bug when trying to intern Kafka offset reset policy.\n [#2327](https://github.com/OpenFn/lightning/issues/2327)\n\n## [v2.7.9] - 2024-07-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- CSS - standardized some more tailwind components\n [PR#2324](https://github.com/OpenFn/lightning/pull/2324)\n\n## [v2.7.8] - 2024-07-24\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Enable End to End Integration tests\n [#2187](https://github.com/OpenFn/lightning/issues/2187)\n- Make selected Kafka trigger parameters configurable via ENV vars.\n [#2315](https://github.com/OpenFn/lightning/issues/2315)\n- Use the Oauth2 `revocation_endpoint` to revoke token access (1) before\n attempting to reauthorize and (2) when users schedule a credential for\n deletion [#2314](https://github.com/OpenFn/lightning/issues/2314)\n- Standardized tailwind alerts\n [#2314](https://github.com/OpenFn/lightning/issues/2314)\n- Standardized `link` tailwind style (and provided `link-plain`, `link-info`,\n `link-error`, and `link-warning`)\n [#2314](https://github.com/OpenFn/lightning/issues/2314)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix work order URL in failure alerts\n [#2305](https://github.com/OpenFn/lightning/pull/2305)\n- Fix error when handling existing encrypted credentials\n [#2316](https://github.com/OpenFn/lightning/issues/2316)\n- Fix job editor switches to the snapshot version when body is changed\n [#2306](https://github.com/OpenFn/lightning/issues/2306)\n- Fix misaligned \"Retry from here\" button on inspector page\n [#2308](https://github.com/OpenFn/lightning/issues/2308)\n\n## [v2.7.7] - 2024-07-18\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add experimental support for triggers that consume message from a Kafka\n cluster [#1801](https://github.com/OpenFn/lightning/issues/1801)\n- Workflows can now specify concurrency, allowing runs to be executed\n syncronously or to a maximum concurrency level. Note that this applies to the\n default FifoRunQueue only.\n [#2022](https://github.com/OpenFn/lightning/issues/2022)\n- Invite Non-Registered Users to a Project\n [#2288](https://github.com/OpenFn/lightning/pull/2288)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Make modal close events configurable\n [#2298](https://github.com/OpenFn/lightning/issues/2298)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Prevent Oauth credentials from being created if they don't have a\n `refresh_token` [#2289](https://github.com/OpenFn/lightning/pull/2289) and\n send more helpful error data back to the worker during token refresh failure\n [#2135](https://github.com/OpenFn/lightning/issues/2135)\n- Fix CLI deploy not creating snapshots for workflows\n [#2271](https://github.com/OpenFn/lightning/issues/2271)\n\n## [v2.7.6] - 2024-07-11\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- UsageTracking crons are enabled again (if config is enabled)\n [#2276](https://github.com/OpenFn/lightning/issues/2276)\n- UsageTracking metrics absorb the fact that a step's job_id may not currently\n exist when counting unique jobs\n [#2279](https://github.com/OpenFn/lightning/issues/2279)\n- Adjusted layout and text displayed when preventing simultaneous edits to\n accommodate more screen sizes\n [#2277](https://github.com/OpenFn/lightning/issues/2277)\n\n## [v2.7.5] - 2024-07-10\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Prevent two editors from making changes to the same workflow at the same time\n [#1949](https://github.com/OpenFn/lightning/issues/1949)\n- Moved the Edge Condition Label field to the top of the form, so it's always\n visible [#2236](https://github.com/OpenFn/lightning/pull/2236)\n- Update edge condition labels in the Workflow Diagram to always show the\n condition type icon and the label\n [#2236](https://github.com/OpenFn/lightning/pull/2236)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Do Not Require Lock Version In URL Parameters\n [#2267](https://github.com/OpenFn/lightning/pull/2267)\n- Trim erroneous spaces on user first and last names\n [#2269](https://github.com/OpenFn/lightning/pull/2269)\n\n## [v2.7.4] - 2024-07-06\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- When the entire log string is a valid JSON object, pretty print it with a\n standard `JSON.stringify(str, null, 2)` but if it's something else then let\n the user do whatever they want (e.g., if you write\n `console.log('some', 'cool', state.data)` we won't mess with it.)\n [#2260](https://github.com/OpenFn/lightning/pull/2260)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed sticky toggle button for switching between latest version and a snapshot\n of a workflow [#2264](https://github.com/OpenFn/lightning/pull/2264)\n\n## [v2.7.3] - 2024-07-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped the ws-worker to v1.3\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix issue when selecting different steps in RunViewer and the parent liveview\n not being informed [#2253](https://github.com/OpenFn/lightning/issues/2253)\n- Stopped inspector from crashing when looking for a step by a run/job\n combination [#2201](https://github.com/OpenFn/lightning/issues/2201)\n- Workflow activation only considers new and changed workflows\n [#2237](https://github.com/OpenFn/lightning/pull/2237)\n\n## [v2.7.2] - 2024-07-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Allow endpoint plugs to be injected at compile time.\n [#2248](https://github.com/OpenFn/lightning/pull/2248)\n- All models to use the `public` schema.\n [#2249](https://github.com/OpenFn/lightning/pull/2249)\n- In the workflow diagram, smartly update the view when adding new nodes\n [#2174](https://github.com/OpenFn/lightning/issues/2174)\n- In the workflow diagram, remove the \"autofit\" toggle in the control bar\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Remove prompt parameter from the authorization URL parameters for the Generic\n Oauth Clients [#2250](https://github.com/OpenFn/lightning/issues/2250)\n- Fixed react key error [#2233](https://github.com/OpenFn/lightning/issues/2233)\n- Show common functions in the Docs panel\n [#1733](https://github.com/OpenFn/lightning/issues/1733)\n\n## [v2.7.1] - 2024-07-01\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Update email copies [#2213](https://github.com/OpenFn/lightning/issues/2213)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix jumpy cursor in the Job editor.\n [#2229](https://github.com/OpenFn/lightning/issues/2229)\n- Rework syncing behaviour to prevent changes getting thrown out on a socket\n reconnect. [#2007](https://github.com/OpenFn/lightning/issues/2007)\n\n## [v2.7.0] - 2024-06-26\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Use of snapshots for displaying runs and their associated steps in the History\n page. [#1825](https://github.com/OpenFn/lightning/issues/1825)\n- Added view-only mode for rendering workflows and runs in the Workflow Canvas\n and the Inspector page using snapshots, with the option to switch between a\n specific snapshot version and the latest version. Edit mode is available when\n displaying the latest version.\n [#1843](https://github.com/OpenFn/lightning/issues/1843)\n- Allow users to delete steps sssociated with runs in the Workflow Canvas\n [#2027](https://github.com/OpenFn/lightning/issues/2027)\n- Link to adaptor `/src` from inspector.\n- Prototype AI Assistant for working with job code.\n [#2193](https://github.com/OpenFn/lightning/issues/2193)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Reverted behaviour on \"Rerun from here\" to select the Log tab.\n [#2202](https://github.com/OpenFn/lightning/issues/2202)\n- Don't allow connections between an orphaned node and a\n Trigger[#2188](https://github.com/OpenFn/lightning/issues/2188)\n- Reduce the minimum zoom in the workflow diagram\n [#2214](https://github.com/OpenFn/lightning/issues/2214)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix some adaptor docs not displaying\n [#2019](https://github.com/OpenFn/lightning/issues/2019)\n- Fix broken `mix lightning.install_adaptor_icons` task due to addition of Finch\n http client change.\n\n## [v2.6.3] - 2024-06-19\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Added a notice on application start about anonymous public impact reporting\n and its importance for the sustainability of\n [Digital Public Goods](https://digitalpublicgoods.net/) and\n [Digital Public Infrastructure](https://www.codevelop.fund/insights-1/what-is-digital-public-infrastructure).\n- Increase default `WORKER_MAX_RUN_DURATION_SECONDS` to 300 to match the\n [ws-worker default](https://github.com/OpenFn/kit/blob/main/packages/ws-worker/src/util/cli.ts#L149-L153)\n so if people don't set their timeout via ENV, at least the two match up.\n\n## [v2.6.2] - 2024-06-13\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix vanishing Docs panel when Editor panel is collapsed and opened again\n [#2195](https://github.com/OpenFn/lightning/issues/2195)\n- Maintain tab when RunViewer remounts/push state drops tab hash\n [#2199](https://github.com/OpenFn/lightning/issues/2199)\n\n## [v2.6.1] - 2024-06-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Erlang to 26.2.5\n- Update debian bookworm from 20240130 to 20240513.\n- Return 403s when Provisioning API fails because of usage limits\n [#2182](https://github.com/OpenFn/lightning/pull/2182)\n- Update email notification for changing retention period\n [#2066](https://github.com/OpenFn/lightning/issues/2066)\n- Return 415s when Webhooks are sent Content-Types what are not supported.\n [#2180](https://github.com/OpenFn/lightning/issues/2180)\n- Updated the default step text\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Rewrite TabSelector (now Tabbed) components fixing a number of navigation\n issues [#2051](https://github.com/OpenFn/lightning/issues/2051)\n\n## [v2.6.0] - 2024-06-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Support multiple edges leading to the same step (a.k.a., \"drag & drop\")\n [#2008](https://github.com/OpenFn/lightning/issues/2008)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"## [v2.5.5] - 2024-06-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Replace LiveView Log Viewer component with React Monaco\n [#1863](https://github.com/OpenFn/lightning/issues/1863)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bump default CLI to `@openfn/cli@1.3.2`\n- Don't show deprecated adaptor versions in the adaptor version picklist (to be\n followed by some graceful deprecation handling/warning in\n [later work](https://github.com/OpenFn/lightning/issues/2172))\n [#2169](https://github.com/OpenFn/lightning/issues/2169)\n- Refactor count workorders to reuse search code\n [#2121](https://github.com/OpenFn/lightning/issues/2121)\n- Updated provisioning error message to include workflow and job names\n [#2140](https://github.com/OpenFn/lightning/issues/2140)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Don't let two deploy workflows run at the same time to prevent git collisions\n [#2044](https://github.com/OpenFn/lightning/issues/2044)\n- Stopped sending emails when creating a starter project\n [#2161](https://github.com/OpenFn/lightning/issues/2161)\n\n## [v2.5.4] - 2024-05-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- CORS support [#2157](https://github.com/OpenFn/lightning/issues/2157)\n- Track users emails preferences\n [#2163](https://github.com/OpenFn/lightning/issues/2163)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Change Default Text For New Job Nodes\n [#2014](https://github.com/OpenFn/lightning/pull/2014)\n- Persisted run options when runs are _created_, not when they are _claimed_.\n This has the benefit of \"locking in\" the behavior desired by the user at the\n time they demand a run, not whenever the worker picks it up.\n [#2085](https://github.com/OpenFn/lightning/pull/2085)\n- Made `RUN_GRACE_PERIOD_SECONDS` a configurable ENV instead of 20% of the\n `WORKER_MAX_RUN_DURATION`\n [#2085](https://github.com/OpenFn/lightning/pull/2085)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Stopped Janitor from calling runs lost if they have special runtime options\n [#2079](https://github.com/OpenFn/lightning/issues/2079)\n- Dataclip Viewer now responds to page resize and internal page layout\n [#2120](https://github.com/OpenFn/lightning/issues/2120)\n\n## [v2.5.3] - 2024-05-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Stop users from creating deprecated Salesforce and GoogleSheets credentials.\n [#2142](https://github.com/OpenFn/lightning/issues/2142)\n- Delegate menu customization and create menu components for reuse.\n [#1988](https://github.com/OpenFn/lightning/issues/1988)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Disable Credential Save Button Until All Form Fields Are Validated\n [#2099](https://github.com/OpenFn/lightning/issues/2099)\n- Fix Credential Modal Closure Error When Workflow Is Unsaved\n [#2101](https://github.com/OpenFn/lightning/pull/2101)\n- Fix error when socket reconnects and user is viewing a run via the inspector\n [#2148](https://github.com/OpenFn/lightning/issues/2148)\n\n## [v2.5.2] - 2024-05-23\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Preserve custom values (like `apiVersion`) during token refresh for OAuth2\n credentials [#2131](https://github.com/OpenFn/lightning/issues/2131)\n\n## [v2.5.1] - 2024-05-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Don't compile Phoenix Storybook in production and test environments\n [#2119](https://github.com/OpenFn/lightning/pull/2119)\n- Improve performance and memory consumption on queries and logic for digest\n mailer [#2121](https://github.com/OpenFn/lightning/issues/2121)\n\n## [v2.5.0] - 2024-05-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- When a refresh token is updated, save it!\n [#2124](https://github.com/OpenFn/lightning/pull/2124)\n\n## [v2.5.0-pre4] - 2024-05-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix duplicate credential type bug\n [#2100](https://github.com/OpenFn/lightning/issues/2100)\n- Ensure Global OAuth Clients Accessibility for All Users\n [#2114](https://github.com/OpenFn/lightning/issues/2114)\n\n## [v2.5.0-pre3] - 2024-05-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix credential not added automatically after being created from the canvas.\n [#2105](https://github.com/OpenFn/lightning/issues/2105)\n- Replace the \"not working?\" prompt by \"All good, but if your credential stops\n working, you may need to re-authorize here.\".\n [#2102](https://github.com/OpenFn/lightning/issues/1872)\n- Fix Generic Oauth credentials don't get included in the refresh flow\n [#2106](https://github.com/OpenFn/lightning/pull/2106)\n\n## [v2.5.0-pre2] - 2024-05-17\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Replace LiveView Dataclip component with React Monaco bringing large\n performance improvements when viewing large dataclips.\n [#1872](https://github.com/OpenFn/lightning/issues/1872)\n\n## [v2.5.0-pre] - 2024-05-17\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow users to build Oauth clients and associated credentials via the user\n interface. [#1919](https://github.com/OpenFn/lightning/issues/1919)\n\n## [v2.4.14] - 2024-05-16\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Refactored image and version info\n [#2097](https://github.com/OpenFn/lightning/pull/2097)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue where updating adaptor name and version of job node in the\n workflow canvas crashes the app when no credential is selected\n [#99](https://github.com/OpenFn/lightning/issues/99)\n- Removes stacked viewer after switching tabs and steps.\n [#2064](https://github.com/OpenFn/lightning/issues/2064)\n\n## [v2.4.13] - 2024-05-16\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue where updating an existing Salesforce credential to use a\n `sandbox` endpoint would not properly re-authenticate.\n [#1842](https://github.com/OpenFn/lightning/issues/1842)\n- Navigate directly to settings from url hash and renders default panel when\n there is no hash. [#1971](https://github.com/OpenFn/lightning/issues/1971)\n\n## [v2.4.12] - 2024-05-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix render settings default panel on first load\n [#1971](https://github.com/OpenFn/lightning/issues/1971)\n\n## [v2.4.11] - 2024-05-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Upgraded Sentry to v10 for better error reporting.\n\n## [v2.4.10] - 2024-05-14\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix the \"reset demo\" script by disabling the emailing that was introduced to\n the `create_project` function.\n [#2063](https://github.com/OpenFn/lightning/pull/2063)\n\n## [v2.4.9] - 2024-05-14\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped @openfn/ws-worker to 1.1.8\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Correctly pass max allowed run time into the Run token, ensuring it's valid\n for the entirety of the Runs execution time\n [#2072](https://github.com/OpenFn/lightning/issues/2072)\n\n## [v2.4.8] - 2024-05-13\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add Github sync to usage limiter\n [#2031](https://github.com/OpenFn/lightning/pull/2031)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Remove illogical cancel buttons on user/pass change screen\n [#2067](https://github.com/OpenFn/lightning/issues/2067)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Stop users from configuring failure alerts when the limiter returns error\n [#2076](https://github.com/OpenFn/lightning/pull/2076)\n\n## [v2.4.7] - 2024-05-11\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed early worker token expiry bug\n [#2070](https://github.com/OpenFn/lightning/issues/2070)\n\n## [v2.4.6] - 2024-05-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow for automatic resubmission of failed usage tracking report submissions.\n [1789](https://github.com/OpenFn/lightning/issues/1789)\n- Make signup feature configurable\n [#2049](https://github.com/OpenFn/lightning/issues/2049)\n- Apply runtime limits to worker execution\n [#2015](https://github.com/OpenFn/lightning/pull/2015)\n- Limit usage for failure alerts\n [#2011](https://github.com/OpenFn/lightning/pull/2011)\n\n## [v2.4.5] - 2024-05-07\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix provioning API calls workflow limiter without the project ID\n [#2057](https://github.com/OpenFn/lightning/issues/2057)\n\n## [v2.4.4] - 2024-05-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Benchmarking script that simulates data from a cold chain.\n [#1993](https://github.com/OpenFn/lightning/issues/1993)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Changed Snapshot `get_or_create_latest_for` to accept multis allow controlling\n of which repo it uses.\n- Require exactly one owner for each project\n [#1991](https://github.com/OpenFn/lightning/issues/1991)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue preventing credential updates\n [#1861](https://github.com/OpenFn/lightning/issues/1861)\n\n## [v2.4.3] - 2024-05-01\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow menu items customization\n [#1988](https://github.com/OpenFn/lightning/issues/1988)\n- Workflow Snapshot support\n [#1822](https://github.com/OpenFn/lightning/issues/1822)\n- Fix sample workflow from init_project_for_new_user\n [#2016](https://github.com/OpenFn/lightning/issues/2016)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped @openfn/ws-worker to 1.1.6\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Assure workflow is always passed to Run.enqueue\n [#2032](https://github.com/OpenFn/lightning/issues/2032)\n- Fix regression on History page where snapshots were not preloaded correctly\n [#2026](https://github.com/OpenFn/lightning/issues/2026)\n\n## [v2.4.2] - 2024-04-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix missing credential types when running Lightning using Docker\n [#2010](https://github.com/OpenFn/lightning/issues/2010)\n- Fix provisioning API includes deleted workflows in project state\n [#2001](https://github.com/OpenFn/lightning/issues/2001)\n\n## [v2.4.1] - 2024-04-19\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix github cli deploy action failing to auto-commit\n [#1995](https://github.com/OpenFn/lightning/issues/1995)\n\n## [v2.4.1-pre] - 2024-04-18\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add custom metric to track the number of finalised runs.\n [#1790](https://github.com/OpenFn/lightning/issues/1790)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Set better defaults for the GitHub connection creation screen\n [#1994](https://github.com/OpenFn/lightning/issues/1994)\n- Update `submission_status` for any Usagetracking.Report that does not have it\n set. [#1789](https://github.com/OpenFn/lightning/issues/1789)\n\n## [v2.4.0] - 2024-04-12\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow description below the page title\n [#1975](https://github.com/OpenFn/lightning/issues/1975)\n- Enable users to connect projects to their Github repos and branches that they\n have access to [#1895](https://github.com/OpenFn/lightning/issues/1895)\n- Enable users to connect multiple projects to a single Github repo\n [#1811](https://github.com/OpenFn/lightning/issues/1811)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Change all System.get_env calls in runtime.exs to use dotenvy\n [#1968](https://github.com/OpenFn/lightning/issues/1968)\n- Track usage tracking submission status in new field\n [#1789](https://github.com/OpenFn/lightning/issues/1789)\n- Send richer version info as part of usage tracking submission.\n [#1819](https://github.com/OpenFn/lightning/issues/1819)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix sync to branch only targetting main branch\n [#1892](https://github.com/OpenFn/lightning/issues/1892)\n- Fix enqueue run without the workflow info\n [#1981](https://github.com/OpenFn/lightning/issues/1981)\n\n## [v2.3.1] - 2024-04-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Run the usage tracking submission job more frequently to reduce the risk of\n Oban unavailability at a particular time.\n [#1778](https://github.com/OpenFn/lightning/issues/1778)\n- Remove code supporting V1 usage tracking submissions.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix scrolling behaviour on inspector for small screens\n [#1962](https://github.com/OpenFn/lightning/issues/1962)\n- Fix project picker for users with many projects\n [#1952](https://github.com/OpenFn/lightning/issues/1952)\n\n## [v2.3.0] - 2024-04-02\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Support for additional paths on a webhook URL such as `/i/ /Patient`\n [#1954](https://github.com/OpenFn/lightning/issues/1954)\n- Support for a GET endpoint to \"check\" webhook URL availability\n [#1063](https://github.com/OpenFn/lightning/issues/1063)\n- Allow external apps to control the run enqueue db transaction\n [#1958](https://github.com/OpenFn/lightning/issues/1958)\n\n## [v2.2.2] - 2024-04-01\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Changed dataclip search from string `LIKE` to tsvector on keys and values.\n While this will limit partial string matching to the beginning of words (not\n the middle or end) it will make searching way more performant\n [#1939](https://github.com/OpenFn/lightning/issues/1939)\n- Translate job error messages using errors.po file\n [#1935](https://github.com/OpenFn/lightning/issues/1935)\n- Improve the UI/UX of the run panel on the inspector for small screens\n [#1909](https://github.com/OpenFn/lightning/issues/1909)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Regular database timeouts when searching across dataclip bodies\n [#1794](https://github.com/OpenFn/lightning/issues/1794)\n\n## [v2.2.1] - 2024-03-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Enable users to connect to their Github accounts in preparation for\n streamlined GitHub project sync setup\n [#1894](https://github.com/OpenFn/lightning/issues/1894)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Apply usage limit to bulk-reruns\n [#1931](https://github.com/OpenFn/lightning/issues/1931)\n- Fix edge case that could result in duplicate usage tracking submissions.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n- Fix query timeout issue on history retention deletion\n [#1937](https://github.com/OpenFn/lightning/issues/1937)\n\n## [v2.2.0] - 2024-03-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow admins to set project retention periods\n [#1760](https://github.com/OpenFn/lightning/issues/1760)\n- Automatically wipe input/output data after their retention period\n [#1762](https://github.com/OpenFn/lightning/issues/1762)\n- Automatically delete work order history after their retention period\n [#1761](https://github.com/OpenFn/lightning/issues/1761)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- When automatically creating a project for a newly registered user (via the\n `INIT_PROJECT_FOR_NEW_USER=true` environment variable) that user should be the\n `owner` of the project.\n [#1927](https://github.com/OpenFn/lightning/issues/1927)\n- Give priority to manual runs (over webhook requests and cron) so that active\n users on the inspector don't have to wait ages for thier work during high load\n periods [#1918](https://github.com/OpenFn/lightning/issues/1918)\n\n## [v2.1.0] - 2024-03-20\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- TSVector index to log_lines, and gin index to dataclips\n [#1898](https://github.com/OpenFn/lightning/issues/1898)\n- Add API Version field to Salesforce OAuth credentials\n [#1838](https://github.com/OpenFn/lightning/issues/1838)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Replace v1 usage tracking with v2 usage tracking.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n## [v2.0.10]\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Updated anonymous usage tracker submissions\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n## [v2.0.9] - 2024-03-19\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Support for smaller screens on history and inspector.\n [#1908](https://github.com/OpenFn/lightning/issues/1908)\n- Polling metric to track number of available runs.\n [#1790](https://github.com/OpenFn/lightning/issues/1790)\n- Allows limiting creation of new runs and retries.\n [#1754](https://github.com/OpenFn/Lightning/issues/1754)\n- Add specific messages for log, input, and output tabs when a run is lost\n [#1757](https://github.com/OpenFn/lightning/issues/1757)\n- Soft and hard limits for runs created by webhook trigger.\n [#1859](https://github.com/OpenFn/Lightning/issues/1859)\n- Publish an event when a new user is registered\n [#1873](https://github.com/OpenFn/lightning/issues/1873)\n- Adds ability to add project collaborators from existing users\n [#1836](https://github.com/OpenFn/lightning/issues/1836)\n- Added ability to remove project collaborators\n [#1837](https://github.com/OpenFn/lightning/issues/1837)\n- Added new usage tracking submission code.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Upgrade Elixir to 1.16.2\n- Remove all values from `.env.example`.\n [#1904](https://github.com/OpenFn/lightning/issues/1904)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Verify only stale project credentials\n [#1861](https://github.com/OpenFn/lightning/issues/1861)\n\n## [v2.0.8] - 2024-02-29\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Show flash error when editing stale project credentials\n [#1795](https://github.com/OpenFn/lightning/issues/1795)\n- Fixed bug with Github sync installation on docker-based deployments\n [#1845](https://github.com/OpenFn/lightning/issues/1845)\n\n## [v2.0.6] - 2024-02-29\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Automatically create Github workflows in a target repository/branch when users\n set up a Github repo::OpenFn project sync\n [#1046](https://github.com/OpenFn/lightning/issues/1046)\n- Allows limiting creation of new runs and retries.\n [#1754](https://github.com/OpenFn/Lightning/issues/1754)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Change bucket size used by the run queue delay custom metric.\n [#1790](https://github.com/OpenFn/lightning/issues/1790)\n- Require setting `IS_RESETTABLE_DEMO` to \"yes\" via ENV before allowing the\n destructive `Demo.reset_demo/0` function from being called.\n [#1720](https://github.com/OpenFn/lightning/issues/1720)\n- Remove version display condition that was redundant due to shadowing\n [#1819](https://github.com/OpenFn/lightning/issues/1819)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix series of sentry issues related to OAuth credentials\n [#1799](https://github.com/OpenFn/lightning/issues/1799)\n\n## [v2.0.5] - 2024-02-25\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed error in Credentials without `sanbox` field set; only display `sandbox`\n field for Salesforce oauth credentials.\n [#1798](https://github.com/OpenFn/lightning/issues/1798)\n\n## [v2.0.4] - 2024-02-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Display and edit OAuth credentials\n scopes[#1706](https://github.com/OpenFn/Lightning/issues/1706)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Stop sending `operating_system_detail` to the usage tracker\n [#1785](https://github.com/OpenFn/lightning/issues/1785)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Make handling of usage tracking errors more robust.\n [#1787](https://github.com/OpenFn/lightning/issues/1787)\n- Fix inspector shows selected dataclip as wiped after retying workorder from a\n non-first step [#1780](https://github.com/OpenFn/lightning/issues/1780)\n\n## [v2.0.3] - 2024-02-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Actual metrics will now be submitted by Lightning to the Usage Tracker.\n [#1742](https://github.com/OpenFn/lightning/issues/1742)\n- Added a support link to the menu that goes to the instance admin contact\n [#1783](https://github.com/OpenFn/lightning/issues/1783)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Usage Tracking submissions are now opt-out, rather than opt-in. Hashed UUIDs\n to ensure anonymity are default.\n [#1742](https://github.com/OpenFn/lightning/issues/1742)\n- Usage Tracking submissions will now run daily rather than hourly.\n [#1742](https://github.com/OpenFn/lightning/issues/1742)\n\n- Bumped @openfn/ws-worker to `v1.0` (this is used in dev mode when starting the\n worker from your mix app: `RTM=true iex -S mix phx.server`)\n- Bumped @openfn/cli to `v1.0` (this is used for adaptor docs and magic)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Non-responsive workflow canvas after web socket disconnection\n [#1750](https://github.com/OpenFn/lightning/issues/1750)\n\n## [v2.0.2] - 2024-02-14\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed a bug with the OAuth2 credential refresh flow that prevented\n GoogleSheets jobs from running after token expiration\n [#1735](https://github.com/OpenFn/Lightning/issues/1735)\n\n## [v2.0.1] - 2024-02-13\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Renamed ImpactTracking to UsageTracking\n [#1729](https://github.com/OpenFn/lightning/issues/1729)\n- Block github installation if there's a pending installation in another project\n [#1731](https://github.com/OpenFn/Lightning/issues/1731)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Expand work order button balloons randomly\n [#1737](https://github.com/OpenFn/Lightning/issues/1737)\n- Editing credentials doesn't work from project scope\n [#1743](https://github.com/OpenFn/Lightning/issues/1743)\n\n## [v2.0.0] - 2024-02-10\n\n> At the time of writing there are no more big changes planned and testing has\n> gone well. Thanks to everyone who's helped to kick the tyres during the \"rc\"\n> phase. There are still a _lot of **new features** coming_, so please:\n>\n> - watch our [**Public Roadmap**](https://github.com/orgs/OpenFn/projects/3) to\n> stay abreast of our core team's backlog,\n> - request a feature in the\n> [**Community Forum**](https://community.openfn.org),\n> - raise a\n> [**new issue**](https://github.com/OpenFn/lightning/issues/new/choose) if\n> you spot a bug,\n> - and head over to the\n> [**Contributing**](https://github.com/OpenFn/lightning/?tab=readme-ov-file#contribute-to-this-project)\n> section to lend a hand.\n>\n> Head to [**docs.openfn.org**](https://docs.openfn.org) for product\n> documentation and help with v1 to v2 migration.\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bump `@openfn/worker` to `v0.8.1`\n- Only show GoogleSheets and Salesforce credential options if Oauth clients are\n registered with the instance via ENV\n [#1734](https://github.com/OpenFn/Lightning/issues/1734)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Use standard table type for webhook auth methods\n [#1514](https://github.com/OpenFn/Lightning/issues/1514)\n- Make disabled button for \"Connect to GitHub\" clear, add tooltip\n [#1732](https://github.com/OpenFn/Lightning/issues/1715)\n\n## [v2.0.0-rc12] - 2024-02-09\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add RunQueue extension to allow claim customization.\n [#1715](https://github.com/OpenFn/Lightning/issues/1715)\n- Add support for Salesforce OAuth2 credentials\n [#1633](https://github.com/OpenFn/Lightning/issues/1633)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Use `PAYLOAD_SIZE_KB` in k6 load testing script, set thresholds on wait time,\n set default payload size to `2kb`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Adds more detail to work order states on dashboard\n [#1677](https://github.com/OpenFn/lightning/issues/1677)\n- Fix Output & Logs in inspector fails to show sometimes\n [#1702](https://github.com/OpenFn/lightning/issues/1702)\n\n## [v2.0.0-rc11] - 2024-02-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Bumped Phoenix LiveView from `0.20.4` to `0.20.5` to fix canvas selection\n issue [#1724](https://github.com/OpenFn/lightning/issues/1724)\n\n## [v2.0.0-rc10] - 2024-02-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Implemented safeguards to prevent deletion of jobs with associated run history\n [#1570](https://github.com/OpenFn/Lightning/issues/1570)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed inspector dataclip body not getting updated after dataclip is wiped\n [#1718](https://github.com/OpenFn/Lightning/issues/1718)\n- Fixed work orders getting retried despite having wiped dataclips\n [#1721](https://github.com/OpenFn/Lightning/issues/1721)\n\n## [v2.0.0-rc9] 2024-02-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Persist impact tracking configuration and reports\n [#1684](https://github.com/OpenFn/Lightning/issues/1684)\n- Add zero-persistence project setting\n [#1209](https://github.com/OpenFn/Lightning/issues/1209)\n- Wipe dataclip after use when zero-persistence is enabled\n [#1212](https://github.com/OpenFn/Lightning/issues/1212)\n- Show appropriate message when a wiped dataclip is viewed\n [#1211](https://github.com/OpenFn/Lightning/issues/1211)\n- Disable selecting work orders having wiped dataclips in the history page\n [#1210](https://github.com/OpenFn/Lightning/issues/1210)\n- Hide rerun button in inspector when the selected step has a wiped dataclip\n [#1639](https://github.com/OpenFn/Lightning/issues/1639)\n- Add rate limiter to webhook endpoints and runtime limiter for runs.\n [#639](https://github.com/OpenFn/Lightning/issues/639)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Prevented secret scrubber from over-eagerly adding \\*\\*\\* between all\n characters if an empty string secret was provided as a credential field value\n (e.g., {\"username\": \"come-on-in\", \"password\": \"\"})\n [#1585](https://github.com/OpenFn/Lightning/issues/1585)\n- Fixed permissions issue that allowed viewer/editor to modify webhook auth\n methods. These permissions only belong to project owners and admins\n [#1692](https://github.com/OpenFn/Lightning/issues/1692)\n- Fixed bug that was duplicating inbound http_requests, resulting in unnecessary\n data storage [#1695](https://github.com/OpenFn/Lightning/issues/1695)\n- Fixed permissions issue that allowed editors to set up new Github connections\n [#1703](https://github.com/OpenFn/Lightning/issues/1703)\n- Fixed permissions issue that allowed viewers to initiate syncs to github\n [#1704](https://github.com/OpenFn/Lightning/issues/1704)\n- Fixed inspector view stuck at processing when following a crashed run\n [#1711](https://github.com/OpenFn/Lightning/issues/1711)\n- Fixed inspector dataclip selector not getting updated after running manual run\n [#1714](https://github.com/OpenFn/Lightning/issues/1714)\n\n## [v2.0.0-rc8] - 2024-01-30\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Shim code to interact with the Impact Tracking service\n [#1671](https://github.com/OpenFn/Lightning/issues/1671)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Standardized naming of \"attempts\" to \"runs\". This had already been done in the\n front-end, but this change cleans up the backend, the database, and the\n interface with the worker. Make sure to **run migrations** and update your\n ENV/secrets to use `WORKER_RUNS_PRIVATE_KEY` rather than\n `WORKER_ATTEMPTS_PRIVATE_KEY`\n [#1657](https://github.com/OpenFn/Lightning/issues/1657)\n- Required `@openfn/ws-worker@0.8.0` or above.\n\n## [v2.0.0-rc7] - 2024-01-26\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Store webhook request headers in Dataclips for use in jobs.\n [#1638](https://github.com/OpenFn/Lightning/issues/1638)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Display `http_request` dataclips to the user as they will be provided to the\n worker as \"input\" state to avoid confusion while writing jobs.\n [1664](https://github.com/OpenFn/Lightning/issues/1664)\n- Named-spaced all worker environment variables with `WORKER_` and added\n documentation for how to configure them.\n [#1672](https://github.com/OpenFn/Lightning/pull/1672)\n- Bumped to `@openfn/ws-worker@0.6.0`\n- Bumped to `@openfn/cli@0.4.15`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix Run via Docker [#1653](https://github.com/OpenFn/Lightning/issues/1653)\n- Fix remaining warnings, enable \"warnings as errors\"\n [#1642](https://github.com/OpenFn/Lightning/issues/1642)\n- Fix workflow dashboard bug when viewed for newly created workflows with only\n unfinished run steps. [#1674](https://github.com/OpenFn/Lightning/issues/1674)\n\n## [v2.0.0-rc5] - 2024-01-22\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Made two significant backend changes that don't impact UI/UX but **require\n migrations** and should make Lightning developer lives easier by updating\n parts of the backend to match terms now used in the frontend:\n - Renamed the `Runs` model and table to `Steps`\n [#1571](https://github.com/OpenFn/Lightning/issues/1571)\n - Renamed the `AttemptRuns` model and table to `AttemptSteps`\n [#1571](https://github.com/OpenFn/Lightning/issues/1571)\n\n## [v2.0.0-rc4] - 2024-01-19\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Scrub output dataclips in the UI to avoid unintentional secret exposure\n [#1606](https://github.com/OpenFn/Lightning/issues/1606)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bump to `@openfn/cli@0.4.14`\n- Do not persist the active tab setting on the job editor\n [#1504](https://github.com/OpenFn/Lightning/issues/1504)\n- Make condition label optional\n [#1648](https://github.com/OpenFn/Lightning/issues/1648)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix credential body getting leaked to sentry incase of errors\n [#1600](https://github.com/OpenFn/Lightning/issues/1600)\n- Fixed validation on Javascript edge conditions\n [#1602](https://github.com/OpenFn/Lightning/issues/1602)\n- Removed unused code from `run_live` directory\n [#1625](https://github.com/OpenFn/Lightning/issues/1625)\n- Edge condition expressions not correctly being handled during provisioning\n [#openfn/kit#560](https://github.com/OpenFn/kit/pull/560)\n\n## [v2.0.0-rc3] 2024-01-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Custom metric to track stalled attempts\n [#1559](https://github.com/OpenFn/Lightning/issues/1559)\n- Dashboard with project and workflow stats\n [#755](https://github.com/OpenFn/Lightning/issues/755)\n- Add search by ID on the history page\n [#1468](https://github.com/OpenFn/Lightning/issues/1468)\n- Custom metric to support autoscaling\n [#1607](https://github.com/OpenFn/Lightning/issues/1607)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped CLI version to `0.4.13`\n- Bumped worker version to `0.5.0`\n- Give project editors and viewers read only access to project settings instead\n [#1477](https://github.com/OpenFn/Lightning/issues/1477)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Throw an error when Lightning.MetadataService.get_adaptor_path/1 returns an\n adaptor path that is nil\n [#1601](https://github.com/OpenFn/Lightning/issues/1601)\n- Fix failure due to creating work order from a newly created job\n [#1572](https://github.com/OpenFn/Lightning/issues/1572)\n- Fixes on the dashboard and links\n [#1610](https://github.com/OpenFn/Lightning/issues/1610) and\n [#1608](https://github.com/OpenFn/Lightning/issues/1608)\n\n## [2.0.0-rc2] - 2024-01-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Restored left-alignment for step list items on run detail and inspector\n [a6e4ada](https://github.com/OpenFn/Lightning/commit/a6e4adafd558269cfd690e7c4fdd8f9fe66c5f62)\n- Inspector: fixed attempt/run language for \"skipped\" tooltip\n [fd7dd0c](https://github.com/OpenFn/Lightning/commit/fd7dd0ca8128dfba2902e5aa6a2259e2073f0f10)\n- Inspector: fixed failure to save during \"save & run\" from inspector\n [#1596](https://github.com/OpenFn/Lightning/issues/1596)\n- Inspector: fixed key bindings for save & run (retry vs. new work order)\n getting overridden when user focuses on the Monaco editor\n [#1596](https://github.com/OpenFn/Lightning/issues/1596)\n\n## [2.0.0-rc1] - 2024-01-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Why does this repo go from `v0` to `v2.0`? - Changelog","doc":"Lightning is the _2nd version_ of the OpenFn platform. While much of the core\ntechnology is the same, there are breaking changes between `v1.105` (pre-2024)\nand `v2` (\"OpenFn Lightning\").\n\nFor customers using OpenFn `v1`, a migration guide will be provided at\n[docs.openfn.org](https://docs.openfn.org)\n\n#","ref":"changelog.html#why-does-this-repo-go-from-v0-to-v2-0"},{"type":"extras","title":"Added - Changelog","doc":"- Link to the job inspctor for a selected run from the history interface\n [#1524](https://github.com/OpenFn/Lightning/issues/1524)\n- Reprocess an existing work order from the job inspector by default (instead of\n always creating a new work order)\n [#1524](https://github.com/OpenFn/Lightning/issues/1524)\n- Bumped worker to support edge conditions between trigger and first job\n `\"@openfn/ws-worker\": \"^0.4.0\"`\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Updated naming to prepare for v2 release\n [#1248](https://github.com/OpenFn/Lightning/issues/1248); the major change is\n that each time a work order (the typical unit of business value for an\n organization, e.g. \"execute workflow ABC for patient 123\") is executed, it is\n called a \"run\". Previously, it was called an \"attempt\". The hierarchy is now:\n\n ```\n Build-Time: Projects > Workflows > Steps\n Run-Time: Work Orders > Runs > Steps\n ```\n\n Note the name changes here are reflected in the UI, but not all tables/models\n will be changed until [1571](https://github.com/OpenFn/Lightning/issues/1571)\n is delivered.\n\n## [v0.12.2] - 2023-12-24\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped worker to address occasional git install issue\n `\"@openfn/ws-worker\": \"^0.3.2\"`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix RuntimeError: found duplicate ID \"google-sheets-inner-form\" for\n GoogleSheetsComponent [#1578](https://github.com/OpenFn/Lightning/issues/1578)\n- Extend export script to include new JS expression edge type\n [#1540](https://github.com/OpenFn/Lightning/issues/1540)\n- Fix regression for attempt viewer log line highlighting\n [#1589](https://github.com/OpenFn/Lightning/issues/1589)\n\n## [v0.12.1] - 2023-12-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Hide project security setting tab from non-authorized users\n [#1477](https://github.com/OpenFn/Lightning/issues/1477)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- History page crashes if job is removed from workflow after it's been run\n [#1568](https://github.com/OpenFn/Lightning/issues/1568)\n\n## [v0.12.0] - 2023-12-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add ellipsis for long job names on the canvas\n [#1217](https://github.com/OpenFn/Lightning/issues/1217)\n- Fix Credential Creation Page UI\n [#1064](https://github.com/OpenFn/Lightning/issues/1064)\n- Custom metric to track Attempt queue delay\n [#1556](https://github.com/OpenFn/Lightning/issues/1556)\n- Expand work order row when a `workorder_id` is specified in the filter\n [#1515](https://github.com/OpenFn/Lightning/issues/1515)\n- Allow Javascript expressions as conditions for edges\n [#1498](https://github.com/OpenFn/Lightning/issues/1498)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Derive dataclip in inspector from the attempt & step\n [#1551](https://github.com/OpenFn/Lightning/issues/1551)\n- Updated CLI to 0.4.10 (fixes logging)\n- Changed UserBackupToken model to use UTC timestamps (6563cb77)\n- Restore FK relationship between `work_orders` and `attempts` pending a\n decision re: further partitioning.\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- New credential doesn't appear in inspector until refresh\n [#1531](https://github.com/OpenFn/Lightning/issues/1531)\n- Metadata not refreshing when credential is updated\n [#791](https://github.com/OpenFn/Lightning/issues/791)\n- Adjusted z-index for Monaco Editor's sibling element to resolve layout\n conflict [#1329](https://github.com/OpenFn/Lightning/issues/1329)\n- Demo script sets up example Runs with their log lines in a consistant order.\n [#1487](https://github.com/OpenFn/Lightning/issues/1487)\n- Initial credential creation `changes` show `after` as `null` rather a value\n [#1118](https://github.com/OpenFn/Lightning/issues/1118)\n- AttemptViewer flashing/rerendering when Jobs are running\n [#1550](https://github.com/OpenFn/Lightning/issues/1550)\n- Not able to create a new Job when clicking the Check icon on the placeholder\n [#1537](https://github.com/OpenFn/Lightning/issues/1537)\n- Improve selection logic on WorkflowDiagram\n [#1220](https://github.com/OpenFn/Lightning/issues/1220)\n\n## [v0.11.0] - 2023-12-06\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Improved UI when manually creating Attempts via the Job Editor\n [#1474](https://github.com/OpenFn/Lightning/issues/1474)\n- Increased the maximum inbound webhook request size to 10MB and added\n protection against _very large_ payloads with a 100MB \"max_skip_body_length\"\n [#1247](https://github.com/OpenFn/Lightning/issues/1247)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Use the internal port of the web container for the worker configuration in\n docker-compose setup. [#1485](https://github.com/OpenFn/Lightning/pull/1485)\n\n## [v0.10.6] - 2023-12-05\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Limit entries count on term work orders search\n [#1461](https://github.com/OpenFn/Lightning/issues/1461)\n- Scrub log lines using multiple credentials samples\n [#1519](https://github.com/OpenFn/Lightning/issues/1519)\n- Remove custom telemetry plumbing.\n [1259](https://github.com/OpenFn/Lightning/issues/1259)\n- Enhance UX to prevent modal closure when Monaco/Dataclip editor is focused\n [#1510](https://github.com/OpenFn/Lightning/pull/1510)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Use checkbox on boolean credential fields rather than a text input field\n [#1430](https://github.com/OpenFn/Lightning/issues/1430)\n- Allow users to retry work orders that failed before their first run was\n created [#1417](https://github.com/OpenFn/Lightning/issues/1417)\n- Fix to ensure webhook auth modal is closed when cancel or close are selected.\n [#1508](https://github.com/OpenFn/Lightning/issues/1508)\n- Enable user to reauthorize and obtain a new refresh token.\n [#1495](https://github.com/OpenFn/Lightning/issues/1495)\n- Save credential body with types declared on schema\n [#1518](https://github.com/OpenFn/Lightning/issues/1518)\n\n## [v0.10.5] - 2023-12-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Only add history page filters when needed for simpler multi-select status\n interface and shorter page URLs\n [#1331](https://github.com/OpenFn/Lightning/issues/1331)\n- Use dynamic Endpoint config only on prod\n [#1435](https://github.com/OpenFn/Lightning/issues/1435)\n- Validate schema field with any of expected values\n [#1502](https://github.com/OpenFn/Lightning/issues/1502)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix for liveview crash when token expires or gets deleted after mount\n [#1318](https://github.com/OpenFn/Lightning/issues/1318)\n- Remove two obsolete methods related to Run: `Lightning.Invocation.delete_run`\n and `Lightning.Invocation.Run.new_from`.\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Remove obsolete field `previous_id` from `runs` table.\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Fix for missing data in 'created' audit trail events for webhook auth methods\n [#1500](https://github.com/OpenFn/Lightning/issues/1500)\n\n## [v0.10.4] - 2023-11-30\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Increased History search timeout to 30s\n [#1461](https://github.com/OpenFn/Lightning/issues/1461)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Tooltip text clears later than the background\n [#1094](https://github.com/OpenFn/Lightning/issues/1094)\n- Temporary fix to superuser UI for managing project users\n [#1145](https://github.com/OpenFn/Lightning/issues/1145)\n- Fix for adding ellipses on credential info on job editor heading\n [#1428](https://github.com/OpenFn/Lightning/issues/1428)\n\n## [v0.10.3] - 2023-11-28\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Dimmed/greyed out triggers and edges on the canvas when they are disabled\n [#1464](https://github.com/OpenFn/Lightning/issues/1464)\n- Async loading on the history page to improve UX on long DB queries\n [#1279](https://github.com/OpenFn/Lightning/issues/1279)\n- Audit trail events for webhook auth (deletion method) change\n [#1165](https://github.com/OpenFn/Lightning/issues/1165)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Sort project collaborators by first name\n [#1326](https://github.com/OpenFn/Lightning/issues/1326)\n- Work orders will now be set in a \"pending\" state when retries are enqueued.\n [#1340](https://github.com/OpenFn/Lightning/issues/1340)\n- Avoid printing 2FA codes by default\n [#1322](https://github.com/OpenFn/Lightning/issues/1322)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Create new workflow button sizing regression\n [#1405](https://github.com/OpenFn/Lightning/issues/1405)\n- Google credential creation and automatic closing of oAuth tab\n [#1109](https://github.com/OpenFn/Lightning/issues/1109)\n- Exporting project breaks the navigation of the page\n [#1440](https://github.com/OpenFn/Lightning/issues/1440)\n\n## [v0.10.2] - 2023-11-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Added `max_frame_size` to the Cowboy websockets protocol options in an attempt\n to address [#1421](https://github.com/OpenFn/Lightning/issues/1421)\n\n## [v0.10.1] - 2023-11-21\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Work Order ID was not displayed properly in history page\n [#1423](https://github.com/OpenFn/Lightning/issues/1423)\n\n## [v0.10.0] - 2023-11-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"🚨 Breaking change warning! 🚨 - Changelog","doc":"This release will contain breaking changes as we've significantly improved both\nthe workflow building and execution systems.\n\n##","ref":"changelog.html#breaking-change-warning"},{"type":"extras","title":"Nodes and edges - Changelog","doc":"Before, workflows were represented as a list of jobs and triggers. For greater\nflexibility and control of complex workflows, we've moved towards a more robust\n\"nodes and edges\" approach. Where jobs in a workflow (a node) can be connected\nby edges.\n\nTriggers still exist, but live \"outside\" the directed acyclic graph (DAG) and\nare used to automatically create work orders and attempts.\n\nWe've provided migrations that bring `v0.9.3` workflows in line with the\n`v0.10.0` requirements.\n\n##","ref":"changelog.html#nodes-and-edges"},{"type":"extras","title":"Scalable workers - Changelog","doc":"Before, Lightning spawned child processes to execute attempts in sand-boxed\nNodeVMs on the same server. This created inefficiencies and security\nvulnerabilities. Now, the Lightning web server adds attempts to a queue and\nmultiple worker applications can pull from that queue to process work.\n\nIn dev mode, this all happens automatically and on one machine, but in most\nhigh-availability production environments the workers will be on another server.\n\nAttempts are now handled entirely by the workers, and they report back to\nLightning. Exit reasons, final attempt states, error types and error messages\nare either entirely new or handled differently now, but we have provided\nmigration scripts that will work to bring _most_ `v0.9.3` runs, attempts, and\nwork orders up to `v0.10.0`, though the granularity of `v0.9.3` states and exits\nwill be less than `v0.10.0` and the final states are not guaranteed to be\naccurate for workflows with multiple branches and leaf nodes with varying exit\nreasons.\n\nThe migration scripts can be run with a single function call in SetupUtils from\na connect `iex` session:\n\n```\nLightning.SetupUtils.approximate_state_for_attempts_and_workorders()\n```\n\nNote that (like lots of _other_ functionality in `SetupUtils`, calling this\nfunction is a destructive action and you should only do it if you've backed up\nyour data and you know what you're doing.)\n\nAs always, we recommend backing up your data before migrating. (And thanks for\nbearing with us as we move towards our first stable Lightning release.)\n\n#","ref":"changelog.html#scalable-workers"},{"type":"extras","title":"Added - Changelog","doc":"- Fix flaky job name input behavior on error\n [#1218](https://github.com/OpenFn/Lightning/issues/1218)\n- Added a hover effect on copy and add button for adaptors examples\n [#1297](https://github.com/OpenFn/Lightning/issues/1297)\n- Migration helper code to move from `v0.9.3` to `v0.10.0` added to SetupUtils\n [#1363](https://github.com/OpenFn/Lightning/issues/1363)\n- Option to start with `RTM=false iex -S mix phx.server` for opting out of the\n dev-mode automatic runtime manager.\n- Webhook Authentication Methods database and CRUD operations\n [#1152](https://github.com/OpenFn/Lightning/issues/1152)\n- Creation and Edit of webhook webhook authentication methods UI\n [#1149](https://github.com/OpenFn/Lightning/issues/1149)\n- Add webhook authentication methods overview methods in the canvas\n [#1153](https://github.com/OpenFn/Lightning/issues/1153)\n- Add icon on the canvas for triggers that have authentication enabled\n [#1157](https://github.com/OpenFn/Lightning/issues/1157)\n- Require password/2FA code before showing password and API Key for webhook auth\n methods [#1200](https://github.com/OpenFn/Lightning/issues/1200)\n- Restrict live dashboard access to only superusers, enable DB information and\n OS information [#1170](https://github.com/OpenFn/Lightning/issues/1170) OS\n information [#1170](https://github.com/OpenFn/Lightning/issues/1170)\n- Expose additional metrics to LiveDashboard\n [#1171](https://github.com/OpenFn/Lightning/issues/1171)\n- Add plumbing to dump Lightning metrics during load testing\n [#1178](https://github.com/OpenFn/Lightning/issues/1178)\n- Allow for heavier payloads during load testing\n [#1179](https://github.com/OpenFn/Lightning/issues/1179)\n- Add dynamic delay to help mitigate flickering test\n [#1195](https://github.com/OpenFn/Lightning/issues/1195)\n- Add a OpenTelemetry trace example\n [#1189](https://github.com/OpenFn/Lightning/issues/1189)\n- Add plumbing to support the use of PromEx\n [#1199](https://github.com/OpenFn/Lightning/issues/1199)\n- Add warning text to PromEx config\n [#1222](https://github.com/OpenFn/Lightning/issues/1222)\n- Track and filter on webhook controller state in :telemetry metrics\n [#1192](https://github.com/OpenFn/Lightning/issues/1192)\n- Secure PromEx metrics endpoint by default\n [#1223](https://github.com/OpenFn/Lightning/issues/1223)\n- Partition `log_lines` table based on `attempt_id`\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Remove foreign key from `attempts` in preparation for partitioning\n `work_orders` [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Remove `Workflows.delete_workflow`. It is no longer in use and would require\n modification to not leave orphaned attempts given the removal of the foreign\n key from `attempts`. [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Show tooltip for cloned runs in history page\n [#1327](https://github.com/OpenFn/Lightning/issues/1327)\n- Have user create workflow name before moving to the canvas\n [#1103](https://github.com/OpenFn/Lightning/issues/1103)\n- Allow PromEx authorization to be disabled\n [#1483](https://github.com/OpenFn/Lightning/issues/1483)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Updated vulnerable JS libraries, `postcss` and `semver`\n [#1176](https://github.com/OpenFn/Lightning/issues/1176)\n- Update \"Delete\" to \"Delete Job\" on Job panel and include javascript deletion\n confirmation [#1105](https://github.com/OpenFn/Lightning/issues/1105)\n- Move \"Enabled\" property from \"Jobs\" to \"Edges\"\n [#895](https://github.com/OpenFn/Lightning/issues/895)\n- Incorrect wording on the \"Delete\" tooltip\n [#1313](https://github.com/OpenFn/Lightning/issues/1313)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed janitor lost query calculation\n [#1400](https://github.com/OpenFn/Lightning/issues/1400)\n- Adaptor icons load gracefully\n [#1140](https://github.com/OpenFn/Lightning/issues/1140)\n- Selected dataclip gets lost when starting a manual work order from the\n inspector interface [#1283](https://github.com/OpenFn/Lightning/issues/1283)\n- Ensure that the whole edge when selected is highlighted\n [#1160](https://github.com/OpenFn/Lightning/issues/1160)\n- Fix \"Reconfigure Github\" button in Project Settings\n [#1386](https://github.com/OpenFn/Lightning/issues/1386)\n- Make janitor also clean up runs inside an attempt\n [#1348](https://github.com/OpenFn/Lightning/issues/1348)\n- Modify CompleteRun to return error changeset when run not found\n [#1393](https://github.com/OpenFn/Lightning/issues/1393)\n- Drop invocation reasons from DB\n [#1412](https://github.com/OpenFn/Lightning/issues/1412)\n- Fix inconsistency in ordering of child nodes in the workflow diagram\n [#1406](https://github.com/OpenFn/Lightning/issues/1406)\n\n## [v0.9.3] - 2023-09-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add ellipsis when adaptor name is longer than the container allows\n [#1095](https://github.com/OpenFn/Lightning/issues/1095)\n- Webhook Authentication Methods database and CRUD operations\n [#1152](https://github.com/OpenFn/Lightning/issues/1152)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Prevent deletion of first job of a workflow\n [#1097](https://github.com/OpenFn/Lightning/issues/1097)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix long name on workflow cards\n [#1102](https://github.com/OpenFn/Lightning/issues/1102)\n- Fix highlighted Edge can get out of sync with selected Edge\n [#1099](https://github.com/OpenFn/Lightning/issues/1099)\n- Creating a new user without a password fails and there is no user feedback\n [#731](https://github.com/OpenFn/Lightning/issues/731)\n- Crash when setting up version control\n [#1112](https://github.com/OpenFn/Lightning/issues/1112)\n\n## [v0.9.2] - 2023-09-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add \"esc\" key binding to close job inspector modal\n [#1069](https://github.com/OpenFn/Lightning/issues/1069)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Save icons from the `adaptors` repo locally and load them in the job editor\n [#943](https://github.com/OpenFn/Lightning/issues/943)\n\n## [v0.9.1] - 2023-09-19\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Modified audit trail to handle lots of different kind of audit events\n [#271](https://github.com/OpenFn/Lightning/issues/271)/[#44](https://github.com/OpenFn/Lightning/issues/44)\n- Fix randomly unresponsive job panel after job deletion\n [#1113](https://github.com/OpenFn/Lightning/issues/1113)\n\n## [v0.9.0] - 2023-09-15\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Add favicons [#1079](https://github.com/OpenFn/Lightning/issues/1079)\n- Validate job name in placeholder job node\n [#1021](https://github.com/OpenFn/Lightning/issues/1021)\n- Bring credential delete in line with new GDPR interpretation\n [#802](https://github.com/OpenFn/Lightning/issues/802)\n- Make job names unique per workflow\n [#1053](https://github.com/OpenFn/Lightning/issues/1053)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Enhanced the job editor/inspector interface\n [#1025](https://github.com/OpenFn/Lightning/issues/1025)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Finished run never appears in inspector when it fails\n [#1084](https://github.com/OpenFn/Lightning/issues/1084)\n- Cannot delete some credentials via web UI\n [#1072](https://github.com/OpenFn/Lightning/issues/1072)\n- Stopped the History table from jumping when re-running a job\n [#1100](https://github.com/OpenFn/Lightning/issues/1100)\n- Fixed the \"+\" button when adding a job to a workflow\n [#1093](https://github.com/OpenFn/Lightning/issues/1093)\n\n## [v0.8.3] - 2023-09-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Render error when workflow diagram node is invalid\n [#956](https://github.com/OpenFn/Lightning/issues/956)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Restyle history table [#1029](https://github.com/OpenFn/Lightning/issues/1029)\n- Moved Filter and Search controls to the top of the history page\n [#1027](https://github.com/OpenFn/Lightning/issues/1027)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Output incorrectly shows \"this run failed\" when the run hasn't yet finished\n [#1048](https://github.com/OpenFn/Lightning/issues/1048)\n- Wrong label for workflow card timestamp\n [#1022](https://github.com/OpenFn/Lightning/issues/1022)\n\n## [v0.8.2] - 2023-08-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Lack of differentiation between top of job editor modal and top menu was\n disorienting. Added shadow.\n\n## [v0.8.1] - 2023-08-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Moved Save and Run button to bottom of the Job edit modal\n [#1026](https://github.com/OpenFn/Lightning/issues/1026)\n- Allow a manual work order to save the workflow before creating the work order\n [#959](https://github.com/OpenFn/Lightning/issues/959)\n\n## [v0.8.0] - 2023-08-31\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Introduces Github sync feature, users can now setup our github app on their\n instance and sync projects using our latest portability spec\n [#970](https://github.com/OpenFn/Lightning/issues/970)\n- Support Backup Codes for Multi-Factor Authentication\n [937](https://github.com/OpenFn/Lightning/issues/937)\n- Log a warning in the console when the Editor/docs component is given latest\n [#958](https://github.com/OpenFn/Lightning/issues/958)\n- Improve feedback when a Workflow name is invalid\n [#961](https://github.com/OpenFn/Lightning/issues/961)\n- Show that the jobs' body is invalid\n [#957](https://github.com/OpenFn/Lightning/issues/957)\n- Reimplement skipped CredentialLive tests\n [#962](https://github.com/OpenFn/Lightning/issues/962)\n- Reimplement skipped WorkflowLive.IndexTest test\n [#964](https://github.com/OpenFn/Lightning/issues/964)\n- Show GitHub installation ID and repo link to help setup/debugging for version\n control [1059](https://github.com/OpenFn/Lightning/issues/1059)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue where job names were being incorrectly hyphenated during\n project.yaml export [#1050](https://github.com/OpenFn/Lightning/issues/1050)\n- Allows the demo script to set a project id during creation to help with cli\n deploy/pull/Github integration testing.\n- Fixed demo project_repo_connection failing after nightly demo resets\n [1058](https://github.com/OpenFn/Lightning/issues/1058)\n- Fixed an issue where the monaco suggestion tooltip was offset from the main\n editor [1030](https://github.com/OpenFn/Lightning/issues/1030)\n\n## [v0.7.3] - 2023-08-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Version control in project settings is now named Export your project\n [#1015](https://github.com/OpenFn/Lightning/issues/1015)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Tooltip for credential select in Job Edit form is cut off\n [#972](https://github.com/OpenFn/Lightning/issues/972)\n- Dataclip type and state assembly notice for creating new dataclip dropped\n during refactor [#975](https://github.com/OpenFn/Lightning/issues/975)\n\n## [v0.7.2] - 2023-08-10\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- NodeJs security patch [1009](https://github.com/OpenFn/Lightning/pull/1009)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"## [v0.7.1] - 2023-08-04\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed flickery icons on new workflow job creation.\n\n## [v0.7.0] - 2023-08-04\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Project owners can require MFA for their users\n [892](https://github.com/OpenFn/Lightning/issues/892)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Moved to Elixir 1.15 and Erlang 26.0.2 to sort our an annoying ElixirLS issue\n that was slowing down our engineers.\n- Update Debian base to use bookworm (Debian 12) for our Docker images\n- Change new credential modal to take up less space on the screen\n [#931](https://github.com/OpenFn/Lightning/issues/931)\n- Placeholder nodes are now purely handled client-side\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix issue creating a new credential from the Job editor where the new\n credential was not being set on the job.\n [#951](https://github.com/OpenFn/Lightning/issues/951)\n- Fix issue where checking a credential type radio button shows as unchecked on\n first click. [#976](https://github.com/OpenFn/Lightning/issues/976)\n- Return the pre-filled workflow names\n [#971](https://github.com/OpenFn/Lightning/issues/971)\n- Fix version reporting and external reset_demo() call via\n Application.spec()[#1010](https://github.com/OpenFn/Lightning/issues/1010)\n- Fixed issue where entering a placeholder name through the form would result an\n in unsaveable workflow\n [#1001](https://github.com/OpenFn/Lightning/issues/1001)\n- Ensure the DownloadController checks for authentication and authorisation.\n\n## [v0.7.0-pre5] - 2023-07-28\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Unless otherwise specified, only show work orders with activity in last 14\n days [#968](https://github.com/OpenFn/Lightning/issues/968)\n\n## [v0.7.0-pre4] - 2023-07-27\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Don't add cast fragments if the search_term is nil\n [#968](https://github.com/OpenFn/Lightning/issues/968)\n\n## [v0.7.0-pre3] - 2023-07-26\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed an issue with newly created edges that prevented downstream jobs\n [977](https://github.com/OpenFn/Lightning/issues/977)\n\n## [v0.7.0-pre2] - 2023-07-26\n\nNote that this is a pre-release with a couple of known bugs that are tracked in\nthe Nodes and Edges [epic](https://github.com/OpenFn/Lightning/issues/793).\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added ability for a user to enable MFA on their account; using 2FA apps like\n Authy, Google Authenticator etc\n [#890](https://github.com/OpenFn/Lightning/issues/890)\n- Write/run sql script to convert triggers\n [#875](https://github.com/OpenFn/Lightning/issues/875)\n- Export projects as `.yaml` via UI\n [#249](https://github.com/OpenFn/Lightning/issues/249)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- In `v0.7.0` we change the underlying workflow building and execution\n infrastructure to align with a standard \"nodes and edges\" design for directed\n acyclic graphs (DAGs). Make sure to run the migrations!\n [793](https://github.com/OpenFn/Lightning/issues/793)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Propagate url pushState/changes to Workflow Diagram selection\n [#944](https://github.com/OpenFn/Lightning/issues/944)\n- Fix issue when deleting nodes from the workflow editor\n [#830](https://github.com/OpenFn/Lightning/issues/830)\n- Fix issue when clicking a trigger on a new/unsaved workflow\n [#954](https://github.com/OpenFn/Lightning/issues/954)\n\n## [0.6.7] - 2023-07-13\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add feature to bulk rerun work orders from a specific step in their workflow;\n e.g., \"rerun these 50 work orders, starting each at step 4.\"\n [#906](https://github.com/OpenFn/Lightning/pull/906)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Oban exception: \"value too long\" when log lines are longer than 255 chars\n [#929](https://github.com/OpenFn/Lightning/issues/929)\n\n## [0.6.6] - 2023-06-30\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add public API token to the demo site setup script\n- Check and renew OAuth credentials when running a job\n [#646](https://github.com/OpenFn/Lightning/issues/646)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Remove google sheets from adaptors list until supporting oauth flow\n [#792](https://github.com/OpenFn/Lightning/issues/792)\n- Remove duplicate google sheets adaptor display on credential type picklist\n [#663](https://github.com/OpenFn/Lightning/issues/663)\n- Fix demo setup script for calling from outside the app on Kubernetes\n deployments [#917](https://github.com/OpenFn/Lightning/issues/917)\n\n## [0.6.5] - 2023-06-22\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Ability to rerun work orders from start by selecting one of more of them from\n the History page and clicking the \"Rerun\" button.\n [#659](https://github.com/OpenFn/Lightning/issues/659)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Example runs for demo incorrect\n [#856](https://github.com/OpenFn/Lightning/issues/856)\n\n## [0.6.3] - 2023-06-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Prevent saving null log lines to the database, fix issue with run display\n [#866](https://github.com/OpenFn/Lightning/issues/866)\n\n## [0.6.2] - 2023-06-09\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed viewer permissions for delete workflow\n\n- Fixed bug with workflow cards\n [#859](https://github.com/OpenFn/Lightning/issues/859)\n\n## [0.6.1] - 2023-06-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed bug with run logs [#864](https://github.com/OpenFn/Lightning/issues/864)\n\n- Correctly stagger demo runs to maintain order\n [#856](https://github.com/OpenFn/Lightning/issues/856)\n- Remove `Timex` use from `SetupUtils` in favor of `DateTime` to fix issue when\n calling it in escript.\n\n## [0.6.0]- 2023-04-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Create sample runs when generating sample workflow\n [#821](https://github.com/OpenFn/Lightning/issues/821)\n- Added a provisioning api for creating and updating projects and their\n workflows See: [PROVISIONING.md](./PROVISIONING.md)\n [#641](https://github.com/OpenFn/Lightning/issues/641)\n- Add ability for a `superuser` to schedule deletion, cancel deletion, and\n delete projects [#757](https://github.com/OpenFn/Lightning/issues/757)\n- Add ability for a `project owner` to schedule deletion, cancel deletion, and\n delete projects [#746](https://github.com/OpenFn/Lightning/issues/746)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Ability to store run log lines as rows in a separate table\n [#514](https://github.com/OpenFn/Lightning/issues/514)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Incorrect project digest queries\n [#768](https://github.com/OpenFn/Lightning/issues/768)]\n- Fix issue when purging deleted users\n [#747](https://github.com/OpenFn/Lightning/issues/747)\n- Generate a random name for Workflows when creating one via the UI.\n [#828](https://github.com/OpenFn/Lightning/issues/828)\n- Handle error when deleting a job with runs.\n [#814](https://github.com/OpenFn/Lightning/issues/814)\n\n## [0.5.2]\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add `workflow_edges` table in preparation for new workflow editor\n implementation [#794](https://github.com/OpenFn/Lightning/issues/794)\n- Stamped `credential_id` on run directly for easier auditing of the history\n interface. Admins can now see which credential was used to run a run.\n [#800](https://github.com/OpenFn/Lightning/issues/800)\n- Better errors when using magic functions: \"no magic yet\" and \"check\n credential\" [#812](https://github.com/OpenFn/Lightning/issues/812)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- The `delete-project` function now delete all associated activities\n [#759](https://github.com/OpenFn/Lightning/issues/759)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"## [0.5.1] - 2023-04-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added ability to create and revoke personal API tokens\n [#147](https://github.com/OpenFn/Lightning/issues/147)\n- Add `last-used at` to API tokens\n [#722](https://github.com/OpenFn/Lightning/issues/722)\n- Improved \"save\" for job builder; users can now press `Ctrl + S` or `⌘ + S` to\n save new or updated jobs job panel will _not_ close. (Click elsewhere in the\n canvas or click the \"Close\" button to close.)\n [#568](https://github.com/OpenFn/Lightning/issues/568)\n- Add filtered search params to the history page URL\n [#660](https://github.com/OpenFn/Lightning/issues/660)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- The secret scrubber now ignores booleans\n [690](https://github.com/OpenFn/Lightning/issues/690)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- The secret scrubber now properly handles integer secrets from credentials\n [690](https://github.com/OpenFn/Lightning/issues/690)\n- Updated describe-package dependency, fixing sparkles in adaptor-docs\n [657](https://github.com/OpenFn/Lightning/issues/657)\n- Clicks on the workflow canvas were not lining up with the nodes users clicked\n on; they are now [733](https://github.com/OpenFn/Lightning/issues/733)\n- Job panel behaves better when collapsed\n [774](https://github.com/OpenFn/Lightning/issues/774)\n\n## [0.5.0] - 2023-04-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Magic functions that fetch real metadata from connected systems via\n `credentials` and suggest completions in the job builder (e.g., pressing\n `control-space` when setting the `orgUnit` attribute for a DHIS2 create\n operation will pull the _actual_ list of orgUnits with human readable labels\n and fill in their orgUnit codes upon\n enter.)[670](https://github.com/OpenFn/Lightning/issues/670)\n- A \"metadata explorer\" to browse actual system metadata for connected\n instances. [658](https://github.com/OpenFn/Lightning/issues/658)\n- Resizable job builder panel for the main canvas/workflow view.\n [681](https://github.com/OpenFn/Lightning/issues/681)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Display timezone for cron schedule—it is always UTC.\n [#716](https://github.com/OpenFn/Lightning/issues/716)\n- Instance administrators can now configure the interval between when a project\n owner or user requests deletion and when these records are purged from the\n database. It defaults to 7, but by providing a `PURGE_DELETED_AFTER_DAYS`\n environment variable the grace period can be altered. Note that setting this\n variable to `0` will make automatic purging _never_ occur but will still make\n \"deleted\" projects and users unavailable. This has been requested by certain\n organizations that must retain audit logs in a Lightning instance.\n [758](https://github.com/OpenFn/Lightning/issues/758)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Locked CLI version to `@openfn/cli@0.0.35`.\n [#761](https://github.com/OpenFn/Lightning/issues/761)\n\n## [0.4.8] - 2023-03-29\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added a test harness for monitoring critical parts of the app using Telemetry\n [#654](https://github.com/OpenFn/Lightning/issues/654)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Set log level to `info` for runs. Most of the `debug` logging is useful for\n the CLI, but not for Lightning. In the future the log level will be\n configurable at instance > project > job level by the `superuser` and any\n project `admin`.\n- Renamed license file so that automagic github icon is less confusing\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Broken links in failure alert email\n [#732](https://github.com/OpenFn/Lightning/issues/732)\n- Registration Submission on app.openfn.org shows internal server error in\n browser [#686](https://github.com/OpenFn/Lightning/issues/686)\n- Run the correct runtime install mix task in `Dockerfile-dev`\n [#541](https://github.com/OpenFn/Lightning/issues/541)\n- Users not disabled when scheduled for deletion\n [#719](https://github.com/OpenFn/Lightning/issues/719)\n\n## [0.4.6] - 2023-03-23\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Implement roles and permissions across entire app\n [#645](https://github.com/OpenFn/Lightning/issues/645)\n- Fix webhook URL\n (`https:// >/i/cae544ab-03dc-4ccc-a09c-fb4edb255d7a`) for the\n OpenHIE demo workflow [448](https://github.com/OpenFn/Lightning/issues/448)\n- Phoenix Storybook for improved component development\n- Load test for webhook endpoint performance\n [#645](https://github.com/OpenFn/Lightning/issues/634)\n- Notify user via email when they're added to a project\n [#306](https://github.com/OpenFn/Lightning/issues/306)\n- Added notify user via email when their account is created\n [#307](https://github.com/OpenFn/Lightning/issues/307)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Improved errors when decoding encryption keys for use with Cloak.\n [#684](https://github.com/OpenFn/Lightning/issues/684)\n- Allow users to run ANY job with a custom input.\n [#629](https://github.com/OpenFn/Lightning/issues/629)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Ensure JSON schema form inputs are in the same order as they are written in\n the schema [#685](https://github.com/OpenFn/Lightning/issues/685)\n\n## [0.4.4] - 2023-03-10\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Users can receive a digest email reporting on a specified project.\n [#638](https://github.com/OpenFn/Lightning/issues/638)\n [#585](https://github.com/OpenFn/Lightning/issues/585)\n\n## [0.4.3] - 2023-03-06\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Added - Changelog","doc":"- Tooltips on Job Builder panel\n [#650](https://github.com/OpenFn/Lightning/issues/650)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Upgraded to Phoenix 1.7 (3945856)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Issue with FailureAlerter configuration missing in `prod` mode.\n\n## [0.4.2] - 2023-02-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- A user can change their own email\n [#247](https://github.com/OpenFn/Lightning/issues/247)\n- Added a `SCHEMAS_PATH` environment variable to override the default folder\n location for credential schemas\n [#604](https://github.com/OpenFn/Lightning/issues/604)\n- Added the ability to configure Google Sheets credentials\n [#536](https://github.com/OpenFn/Lightning/issues/536)\n- Function to import a project\n [#574](https://github.com/OpenFn/Lightning/issues/574)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Users cannot register if they have not selected the terms and conditions\n [#531](https://github.com/OpenFn/Lightning/issues/531)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Jobs panel slow for first open after restart\n [#567](https://github.com/OpenFn/Lightning/issues/567)\n\n## [0.4.0] - 2023-02-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added a Delete job button in Inspector\n- Filter workflow runs by text/value in run logs or input body\n- Drop \"configuration\" key from Run output dataclips after completion\n- Ability to 'rerun' a run from the Run list\n- Attempts and Runs update themselves in the Runs list\n- Configure a project and workflow for a new registering user\n- Run a job with a custom input\n- Added plausible analytics\n- Allow user to click on Webhook Trigger Node to copy webhook URL on workflow\n diagram\n- Allow any user to delete a credential that they own\n- Create any credential through a form except for OAuth\n- Refit all diagram nodes on browser and container resize\n- Enable distributed Erlang, allowing any number of redundant Lightning nodes to\n communicate with each other.\n- Users can set up realtime alerts for a project\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Better code-assist and intelliense in the Job Editor\n- Updated @openfn/workflow-diagram to 0.4.0\n- Make plus button part of job nodes in Workflow Diagram\n- Updated @openfn/adaptor-docs to 0.0.5\n- Updated @openfn/describe-package to 0.0.10\n- Create an follow a manual Run from the Job Inspector\n- View all workflows in a project on the workflows index page\n- Move @openfn/workflow-diagram into the application, the NPM module is now\n deprecated.\n- Remove workflow name from first node\n- Move the used parts of `@openfn/engine` into the application.\n- [BREAKING CHANGE] Ported `mix openfn.install.runtime` into application, use\n `mix lightning.install_runtime`.\n- [BREAKING CHANGE] Introduced `@openfn/cli` as the new runtime for Jobs\n- Rename a workflow through the page heading\n- Hide the dataclips tab for beta\n- Make adaptor default to common@latest\n- Remove jobs list page\n- Better error handling in the docs panel\n- Disable credential ownership transfer in dev and prod environments\n- Add project settings page\n- Change Work Order filters to apply to the aggregate state of the work order\n and not the run directly\n- Enable jobs by default\n- Set log level to info\n- Add Beta checkbox to register page\n- User roles and permissions\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Don't consider disabled jobs when calculating subsequent runs\n- Fixed overflow on Job Editor Tooltips\n- Fixed auto-scroll when adding a new snippet in the Job Editor\n- Fixed common operation typings in Job Editor\n\n## [0.3.1] - 2022-11-22\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed bug that tried to execute HTML scripts in dataclips\n- Fixed bug that prevented work orders from displaying in the order of their\n last run, descending.\n- Remove alerts after set timeout or close\n\n## [0.3.0] - 2022-11-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add seed data for demo site\n- Create adaptor credentials through a form\n- Configure cron expressions through a form\n- View runs grouped by work orders and attempts\n- Run an existing Job with any dataclip uuid from the Job form\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Redirect users to projects list page when they click on Admin Settings menu\n- Move job, project, input and output Dataclips to Run table\n- Reverse the relationship between Jobs and Triggers. Triggers now can exist on\n their own; setting the stage for branching and merging workflows\n- Updated Elixir and frontend dependencies\n- [BREAKING CHANGE] Pipeline now uses Work Orders, previous data is not\n compatible.\n- Runs, Dataclips and Attempts now all correctly use `usec` resolution\n timestamps.\n- Upgraded LiveView to 0.18.0\n- Upgraded Elixir to 1.14.1 and OTP 25\n- Workflow Job editor now behaves like a panel\n- Split JobLive.InspectorFormComponent into different plug-able subcomponents\n- Ensure new jobs with cron triggers receive a default frequency\n- Webhooks are now referenced by the trigger id instead of job id.\n- Filter runs by status\n- Filter runs by workflow\n- Filter runs by date\n- View a job run from the runs history\n- View latest matching inputs to run a job with\n\n## [0.2.0] - 2022-09-12\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- [BREAKING CHANGE] Add `Workflow` model, Jobs now belong to a Workflow This is\n a breaking change to the schema.\n- Use Node.js 18, soon to be in LTS.\n- Visualize success/fail triggers in workflow diagram.\n- Move WorkflowDiagram related actions from DashboardLive into WorkflowLive\n- Move WorkflowDiagram component into liveview, so that we can subscribe to\n channels (i.e. updating of the diagram when someone changes something).\n- Integrate `@openfn/workflow-diagram@0.0.8` and use the new Store interface for\n updating it.\n- Remove `component_mounted` event from WorkflowDiagram hook, using a\n MutationObserver and a Base64 encoded JSON payload.\n- Fixed an issue where the compiler component would try and load a 'nothing\n adaptor', added a condition to check an adaptor is actually selected.\n- Removed previous Workflow CTE queries, replaced by the introduction of the\n Workflow model, see\n (https://github.com/OpenFn/Lightning/blob/53da6883483e7d8d078783f348da327d1dd72d20/lib/lightning/workflows.ex#L111-L119).\n\n## [0.1.13] - 2022-08-29\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow administrators to configure OIDC providers for authentication (note that\n this is just for authenticating, not yet for creating new accounts via OIDC)\n- Add Monaco editor to the step/job panel\n- Allow users to delete their own accounts. Schedule their user and credentials\n data for deletion when they do.\n- Allow superusers to delete a user account. Schedule the user's credentials and\n user data for deletion when they do.\n- If a user is scheduled for deletion, disable their account and prevent them\n from logging in.\n- The 'User profile' and 'Credentials' page now have a sidebar menu\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Project users now have one of the following roles: viewer, editor, admin,\n owner\n- Users only have the following roles: user, superuser\n\n## [0.1.12] - 2022-08-15\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Transfer credential ownership to another user.\n- Create credentials via a form interface\\*\n- Show \"projects with access\" in credentials list view.\n- Show job in runs list and run view.\n- Added roles and permissions to workflows and history page\n [#645](https://github.com/OpenFn/Lightning/issues/645)\n\n\\*The form is defined by a JSON schema provided by an adaptor, in most cases:\ne.g., `language-dhis2` provides a single schema which defines the required\nattributes for `state.configuration`, while `language-common` provides multiple\ncredential schemas like \"oauth\" or \"basic auth\" which define attributes for\n`state.configuration` and which might be used by lots of different jobs.)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- User menu (top right) appears on top of all other components.\n- User profile screen integrated with the rest of the liveview app.\n\n## [0.1.11] - 2022-08-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed logging in Runner when `:debug` log level used; note that this caused\n crashes in Oban\n\n## [0.1.10] - 2022-08-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Credential auditing\n- Build/version information display for easier debugging\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed a bug that enqueued cron-triggered jobs even when they were disabled\n\n## [0.1.9] - 2022-07-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Navigate to user profile or credentials page and log out through the user icon\n dropdown\n- Create and edit dataclips\n- Add a production tag to credentials\n- View a dropdown of operations and their description for the language-common\n `v2.0.0-rc2` adaptor (this pattern to be rolled out across adaptors)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Navigate between projects through a project picker on the navbar\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Run Lightning with docker\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Security - Changelog","doc":"- Sensitive credential values are scrubbed from run logs\n- All credentials are encrypted at REST\n\n## [0.1.7] - 2022-06-24\n\n#","ref":"changelog.html#security"},{"type":"extras","title":"Added - Changelog","doc":"- Run a job with a cron trigger\n- Queue jobs via Oban/Postgres\n- Edit jobs via the workflow canvas\n\n## [0.1.6] - 2022-06-07\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Added - Changelog","doc":"- Register, log in and log out of an account\n- Allow superusers and admin users to create projects\n- Allow admin users to create or disable a user’s account\n- Allow superusers for local deployments to create users and give them access to\n project spaces\n\n- Create and edit a job with a webhook, flow/fail or cron trigger\n- Create and edit credentials for a job\n- Copy a job's webhook URL\n- View all workflows in a project visually\n- Deploy lightning locally with Docker\n\n- Enable a job to automatically process incoming requests\n- Run a job with a webhook or flow/fail trigger\n- View job runs along with their logs, exit code, start and end time\n- View data clips that have initiated job runs (http requests for webhooks, run\n results)","ref":"changelog.html#added"}],"content_type":"text/markdown"}
\ No newline at end of file
+searchData={"items":[{"type":"behaviour","title":"Lightning","doc":"Lightning keeps the contexts that define your domain\nand business logic.\n\nContexts are also responsible for managing your data, regardless\nif it comes from the database, an external API or others.","ref":"Lightning.html"},{"type":"function","title":"Lightning.broadcast/2","doc":"","ref":"Lightning.html#broadcast/2"},{"type":"callback","title":"Lightning.broadcast/2","doc":"","ref":"Lightning.html#c:broadcast/2"},{"type":"function","title":"Lightning.current_time/0","doc":"Returns the current time at UTC.","ref":"Lightning.html#current_time/0"},{"type":"callback","title":"Lightning.current_time/0","doc":"","ref":"Lightning.html#c:current_time/0"},{"type":"function","title":"Lightning.local_broadcast/2","doc":"","ref":"Lightning.html#local_broadcast/2"},{"type":"callback","title":"Lightning.local_broadcast/2","doc":"","ref":"Lightning.html#c:local_broadcast/2"},{"type":"function","title":"Lightning.release/0","doc":"","ref":"Lightning.html#release/0"},{"type":"callback","title":"Lightning.release/0","doc":"","ref":"Lightning.html#c:release/0"},{"type":"function","title":"Lightning.subscribe/1","doc":"","ref":"Lightning.html#subscribe/1"},{"type":"callback","title":"Lightning.subscribe/1","doc":"","ref":"Lightning.html#c:subscribe/1"},{"type":"type","title":"Lightning.release_info/0","doc":"","ref":"Lightning.html#t:release_info/0"},{"type":"module","title":"ObanPruner","doc":"The Oban Pruner removes completed Oban jobs. It leaves everything else for manual inspection.","ref":"ObanPruner.html"},{"type":"function","title":"ObanPruner.perform/1","doc":"Deletes completed Oban jobs, leaving discarded for manual inspection.","ref":"ObanPruner.html#perform/1"},{"type":"module","title":"Lightning.Accounts","doc":"The Accounts context.","ref":"Lightning.Accounts.html"},{"type":"function","title":"Lightning.Accounts.apply_user_email/3","doc":"Emulates that the email will change without actually changing\nit in the database.","ref":"Lightning.Accounts.html#apply_user_email/3"},{"type":"function","title":"Examples - Lightning.Accounts.apply_user_email/3","doc":"iex> apply_user_email(user, \"valid password\", %{email: ...})\n {:ok, %User{}}role: :superuser\n iex> apply_user_email(user, \"invalid password\", %{email: ...})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#apply_user_email/3-examples"},{"type":"function","title":"Lightning.Accounts.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Accounts.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Accounts.change_scheduled_deletion/2","doc":"Returns an `%Ecto.Changeset{}` for changing the user scheduled_deletion.","ref":"Lightning.Accounts.html#change_scheduled_deletion/2"},{"type":"function","title":"Examples - Lightning.Accounts.change_scheduled_deletion/2","doc":"iex> change_scheduled_deletion(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_scheduled_deletion/2-examples"},{"type":"function","title":"Lightning.Accounts.change_superuser_registration/1","doc":"Returns an `%Ecto.Changeset{}` for tracking superuser changes.","ref":"Lightning.Accounts.html#change_superuser_registration/1"},{"type":"function","title":"Examples - Lightning.Accounts.change_superuser_registration/1","doc":"iex> change_superuser_registration(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_superuser_registration/1-examples"},{"type":"function","title":"Lightning.Accounts.change_user/2","doc":"","ref":"Lightning.Accounts.html#change_user/2"},{"type":"function","title":"Lightning.Accounts.change_user_email/2","doc":"Returns an `%Ecto.Changeset{}` for changing the user email.","ref":"Lightning.Accounts.html#change_user_email/2"},{"type":"function","title":"Examples - Lightning.Accounts.change_user_email/2","doc":"iex> change_user_email(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_user_email/2-examples"},{"type":"function","title":"Lightning.Accounts.change_user_info/2","doc":"","ref":"Lightning.Accounts.html#change_user_info/2"},{"type":"function","title":"Lightning.Accounts.change_user_password/2","doc":"Returns an `%Ecto.Changeset{}` for changing the user password.","ref":"Lightning.Accounts.html#change_user_password/2"},{"type":"function","title":"Examples - Lightning.Accounts.change_user_password/2","doc":"iex> change_user_password(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_user_password/2-examples"},{"type":"function","title":"Lightning.Accounts.change_user_registration/1","doc":"Returns an `%Ecto.Changeset{}` for tracking user changes.","ref":"Lightning.Accounts.html#change_user_registration/1"},{"type":"function","title":"Examples - Lightning.Accounts.change_user_registration/1","doc":"iex> change_user_registration(user)\n %Ecto.Changeset{data: %User{}}","ref":"Lightning.Accounts.html#change_user_registration/1-examples"},{"type":"function","title":"Lightning.Accounts.confirm_user/1","doc":"Confirms a user by the given token.\n\nIf the token matches, the user account is marked as confirmed\nand the token is deleted.","ref":"Lightning.Accounts.html#confirm_user/1"},{"type":"function","title":"Lightning.Accounts.confirmation_required?/1","doc":"","ref":"Lightning.Accounts.html#confirmation_required?/1"},{"type":"function","title":"Lightning.Accounts.create_user/1","doc":"","ref":"Lightning.Accounts.html#create_user/1"},{"type":"function","title":"Lightning.Accounts.delete_auth_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_auth_token/1"},{"type":"function","title":"Lightning.Accounts.delete_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_sudo_session_token/1","doc":"Deletes the signed token with the given context.","ref":"Lightning.Accounts.html#delete_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.delete_token/1","doc":"Deletes a token.","ref":"Lightning.Accounts.html#delete_token/1"},{"type":"function","title":"Examples - Lightning.Accounts.delete_token/1","doc":"iex> delete_token(token)\n {:ok, %UserToken{}}\n\n iex> delete_token(token)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#delete_token/1-examples"},{"type":"function","title":"Lightning.Accounts.delete_user/1","doc":"Deletes a user.","ref":"Lightning.Accounts.html#delete_user/1"},{"type":"function","title":"Examples - Lightning.Accounts.delete_user/1","doc":"iex> delete_user(user)\n {:ok, %User{}}\n\n iex> delete_user(user)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#delete_user/1-examples"},{"type":"function","title":"Lightning.Accounts.delete_user_totp/1","doc":"Deletes the given user's TOTP","ref":"Lightning.Accounts.html#delete_user_totp/1"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/1","doc":"Delivers the confirmation email instructions to the given user.","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/1"},{"type":"function","title":"Examples - Lightning.Accounts.deliver_user_confirmation_instructions/1","doc":"iex> deliver_user_confirmation_instructions(user)\n {:ok, %{to: ..., body: ...}}\n\n iex> deliver_user_confirmation_instructions(confirmed_user)\n {:error, :already_confirmed}","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/1-examples"},{"type":"function","title":"Lightning.Accounts.deliver_user_confirmation_instructions/2","doc":"","ref":"Lightning.Accounts.html#deliver_user_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.deliver_user_reset_password_instructions/2","doc":"Delivers the reset password email to the given user.","ref":"Lightning.Accounts.html#deliver_user_reset_password_instructions/2"},{"type":"function","title":"Examples - Lightning.Accounts.deliver_user_reset_password_instructions/2","doc":"iex> deliver_user_reset_password_instructions(user, &Routes.user_reset_password_url(conn, :edit, &1))\n {:ok, %{to: ..., body: ...}}","ref":"Lightning.Accounts.html#deliver_user_reset_password_instructions/2-examples"},{"type":"function","title":"Lightning.Accounts.exchange_auth_token/1","doc":"Exchanges an auth token for a session token.\n\nThe auth token is removed from the database if successful.","ref":"Lightning.Accounts.html#exchange_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_api_token/1","doc":"Generates an API token for a user.","ref":"Lightning.Accounts.html#generate_api_token/1"},{"type":"function","title":"Lightning.Accounts.generate_auth_token/1","doc":"Generates an auth token.","ref":"Lightning.Accounts.html#generate_auth_token/1"},{"type":"function","title":"Lightning.Accounts.generate_sudo_session_token/1","doc":"Generates a 2FA session token.","ref":"Lightning.Accounts.html#generate_sudo_session_token/1"},{"type":"function","title":"Lightning.Accounts.generate_user_session_token/1","doc":"Generates a session token.","ref":"Lightning.Accounts.html#generate_user_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_token!/1","doc":"Gets a single token.\n\nRaises `Ecto.NoResultsError` if the UserToken does not exist.","ref":"Lightning.Accounts.html#get_token!/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_token!/1","doc":"iex> get_token!(123)\n %UserToken{}\n\n iex> get_token!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_token!/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user!/1","doc":"Gets a single user.\n\nRaises `Ecto.NoResultsError` if the User does not exist.","ref":"Lightning.Accounts.html#get_user!/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_user!/1","doc":"iex> get_user!(123)\n %User{}\n\n iex> get_user!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Accounts.html#get_user!/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_api_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_api_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_auth_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_auth_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_by_email/1","doc":"Gets a user by email.","ref":"Lightning.Accounts.html#get_user_by_email/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_user_by_email/1","doc":"iex> get_user_by_email(\"foo@example.com\")\n %User{}\n\n iex> get_user_by_email(\"unknown@example.com\")\n nil","ref":"Lightning.Accounts.html#get_user_by_email/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_email_and_password/2","doc":"Gets a user by email and password.","ref":"Lightning.Accounts.html#get_user_by_email_and_password/2"},{"type":"function","title":"Examples - Lightning.Accounts.get_user_by_email_and_password/2","doc":"iex> get_user_by_email_and_password(\"foo@example.com\", \"correct_password\")\n %User{}\n\n iex> get_user_by_email_and_password(\"foo@example.com\", \"invalid_password\")\n nil","ref":"Lightning.Accounts.html#get_user_by_email_and_password/2-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_reset_password_token/1","doc":"Gets the user by reset password token.","ref":"Lightning.Accounts.html#get_user_by_reset_password_token/1"},{"type":"function","title":"Examples - Lightning.Accounts.get_user_by_reset_password_token/1","doc":"iex> get_user_by_reset_password_token(\"validtoken\")\n %User{}\n\n iex> get_user_by_reset_password_token(\"invalidtoken\")\n nil","ref":"Lightning.Accounts.html#get_user_by_reset_password_token/1-examples"},{"type":"function","title":"Lightning.Accounts.get_user_by_session_token/1","doc":"Gets the user with the given signed token.","ref":"Lightning.Accounts.html#get_user_by_session_token/1"},{"type":"function","title":"Lightning.Accounts.get_user_totp/1","doc":"Gets a single UserTOTP if any exists.","ref":"Lightning.Accounts.html#get_user_totp/1"},{"type":"function","title":"Lightning.Accounts.get_users_to_alert_for_project/1","doc":"Gets all users to alert of workflow failure for a project","ref":"Lightning.Accounts.html#get_users_to_alert_for_project/1"},{"type":"function","title":"Lightning.Accounts.has_activity_in_projects?/1","doc":"","ref":"Lightning.Accounts.html#has_activity_in_projects?/1"},{"type":"function","title":"Lightning.Accounts.has_one_superuser?/0","doc":"Used to determine if there is at least one Superuser in the system.\nThis triggers the setup page on fresh installs.","ref":"Lightning.Accounts.html#has_one_superuser?/0"},{"type":"function","title":"Lightning.Accounts.list_api_tokens/1","doc":"Lists all user tokens","ref":"Lightning.Accounts.html#list_api_tokens/1"},{"type":"function","title":"Lightning.Accounts.list_user_backup_codes/1","doc":"Lists the user backup codes","ref":"Lightning.Accounts.html#list_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.list_users/0","doc":"Returns the list of users.","ref":"Lightning.Accounts.html#list_users/0"},{"type":"function","title":"Examples - Lightning.Accounts.list_users/0","doc":"iex> list_users()\n [%User{}, ...]","ref":"Lightning.Accounts.html#list_users/0-examples"},{"type":"function","title":"Lightning.Accounts.list_users_by_emails/1","doc":"Returns the list of users with the given emails","ref":"Lightning.Accounts.html#list_users_by_emails/1"},{"type":"function","title":"Lightning.Accounts.perform/1","doc":"Perform, when called with %{\"type\" => \"purge_deleted\"} will find users that are ready for permanent deletion and purge them.","ref":"Lightning.Accounts.html#perform/1"},{"type":"function","title":"Lightning.Accounts.purge_user/1","doc":"","ref":"Lightning.Accounts.html#purge_user/1"},{"type":"function","title":"Lightning.Accounts.regenerate_user_backup_codes/1","doc":"Regenerates the user backup codes","ref":"Lightning.Accounts.html#regenerate_user_backup_codes/1"},{"type":"function","title":"Lightning.Accounts.register_superuser/1","doc":"Registers a superuser.","ref":"Lightning.Accounts.html#register_superuser/1"},{"type":"function","title":"Examples - Lightning.Accounts.register_superuser/1","doc":"iex> register_superuser(%{field: value})\n {:ok, %User{}}\n\n iex> register_superuser(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#register_superuser/1-examples"},{"type":"function","title":"Lightning.Accounts.register_user/1","doc":"Registers a user.","ref":"Lightning.Accounts.html#register_user/1"},{"type":"function","title":"Examples - Lightning.Accounts.register_user/1","doc":"iex> register_user(%{field: value})\n {:ok, %User{}}\n\n iex> register_user(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#register_user/1-examples"},{"type":"function","title":"Lightning.Accounts.remind_account_confirmation/1","doc":"","ref":"Lightning.Accounts.html#remind_account_confirmation/1"},{"type":"function","title":"Lightning.Accounts.request_email_update/2","doc":"Delivers the update email instructions to the given user.","ref":"Lightning.Accounts.html#request_email_update/2"},{"type":"function","title":"Examples - Lightning.Accounts.request_email_update/2","doc":"iex> request_email_update(user, new_email)\n :ok","ref":"Lightning.Accounts.html#request_email_update/2-examples"},{"type":"function","title":"Lightning.Accounts.reset_user_password/2","doc":"Resets the user password.","ref":"Lightning.Accounts.html#reset_user_password/2"},{"type":"function","title":"Examples - Lightning.Accounts.reset_user_password/2","doc":"iex> reset_user_password(user, %{password: \"new long password\", password_confirmation: \"new long password\"})\n {:ok, %User{}}\n\n iex> reset_user_password(user, %{password: \"valid\", password_confirmation: \"not the same\"})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#reset_user_password/2-examples"},{"type":"function","title":"Lightning.Accounts.schedule_user_deletion/2","doc":"Given a user and a confirmation email, this function sets a scheduled deletion\ndate based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is\nset, this date defaults to NOW but the automatic user purge cronjob will never\nrun. (Note that subsequent logins will be blocked for users pending deletion.)","ref":"Lightning.Accounts.html#schedule_user_deletion/2"},{"type":"function","title":"Lightning.Accounts.subscribe/0","doc":"","ref":"Lightning.Accounts.html#subscribe/0"},{"type":"function","title":"Lightning.Accounts.sudo_session_token_valid?/2","doc":"Checks if the given sudo token for the user is valid","ref":"Lightning.Accounts.html#sudo_session_token_valid?/2"},{"type":"function","title":"Lightning.Accounts.update_user_details/2","doc":"","ref":"Lightning.Accounts.html#update_user_details/2"},{"type":"function","title":"Lightning.Accounts.update_user_email/2","doc":"Updates the user email using the given token.\n\nIf the token matches, the user email is updated and the token is deleted.\nThe confirmed_at date is also updated to the current time.","ref":"Lightning.Accounts.html#update_user_email/2"},{"type":"function","title":"Lightning.Accounts.update_user_info/2","doc":"","ref":"Lightning.Accounts.html#update_user_info/2"},{"type":"function","title":"Lightning.Accounts.update_user_password/3","doc":"Updates the user password.","ref":"Lightning.Accounts.html#update_user_password/3"},{"type":"function","title":"Examples - Lightning.Accounts.update_user_password/3","doc":"iex> update_user_password(user, \"valid password\", %{password: ...})\n {:ok, %User{}}\n\n iex> update_user_password(user, \"invalid password\", %{password: ...})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Accounts.html#update_user_password/3-examples"},{"type":"function","title":"Lightning.Accounts.upsert_user_totp/2","doc":"Updates or Inserts the user's TOTP","ref":"Lightning.Accounts.html#upsert_user_totp/2"},{"type":"function","title":"Lightning.Accounts.valid_user_backup_code?/2","doc":"Validates if the given Backup code is valid.","ref":"Lightning.Accounts.html#valid_user_backup_code?/2"},{"type":"function","title":"Lightning.Accounts.valid_user_totp?/2","doc":"Validates if the given TOTP code is valid.","ref":"Lightning.Accounts.html#valid_user_totp?/2"},{"type":"function","title":"Lightning.Accounts.validate_change_user_email/2","doc":"Validates the changes for updating a user's email address.\n\nThis function ensures that:\n- The `email` and `current_password` fields are present.\n- The new email is in a valid format.\n- The new email is different from the current one.\n- The provided `current_password` matches the user's password.","ref":"Lightning.Accounts.html#validate_change_user_email/2"},{"type":"function","title":"Parameters - Lightning.Accounts.validate_change_user_email/2","doc":"- `user`: The `%User{}` struct representing the current user.\n- `params`: A map of parameters containing the new email and current password.","ref":"Lightning.Accounts.html#validate_change_user_email/2-parameters"},{"type":"function","title":"Returns - Lightning.Accounts.validate_change_user_email/2","doc":"An `Ecto.Changeset` containing any validation errors.","ref":"Lightning.Accounts.html#validate_change_user_email/2-returns"},{"type":"function","title":"Examples - Lightning.Accounts.validate_change_user_email/2","doc":"iex> validate_change_user_email(user, %{\"email\" => \"new@example.com\", \"current_password\" => \"secret\"})\n %Ecto.Changeset{...}","ref":"Lightning.Accounts.html#validate_change_user_email/2-examples"},{"type":"module","title":"Lightning.Accounts.Events","doc":"Publishes and subscribe to events related to user accounts.","ref":"Lightning.Accounts.Events.html"},{"type":"function","title":"Lightning.Accounts.Events.subscribe/0","doc":"","ref":"Lightning.Accounts.Events.html#subscribe/0"},{"type":"function","title":"Lightning.Accounts.Events.user_registered/1","doc":"","ref":"Lightning.Accounts.Events.html#user_registered/1"},{"type":"module","title":"Lightning.Accounts.User","doc":"The User model.","ref":"Lightning.Accounts.User.html"},{"type":"function","title":"Lightning.Accounts.User.changeset/2","doc":"","ref":"Lightning.Accounts.User.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.User.confirm_changeset/1","doc":"Confirms the account by setting `confirmed_at`.","ref":"Lightning.Accounts.User.html#confirm_changeset/1"},{"type":"function","title":"Lightning.Accounts.User.details_changeset/2","doc":"A user changeset for user details:\n\n- email\n- first_name\n- last_name\n- role","ref":"Lightning.Accounts.User.html#details_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.email_changeset/2","doc":"A user changeset for changing the email.\n\nIt requires the email to change otherwise an error is added.","ref":"Lightning.Accounts.User.html#email_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.github_token_changeset/2","doc":"","ref":"Lightning.Accounts.User.html#github_token_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.info_changeset/2","doc":"A user changeset for basic information:\n\n- first_name\n- last_name\n- contact_preference","ref":"Lightning.Accounts.User.html#info_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.password_changeset/3","doc":"A user changeset for changing the password.","ref":"Lightning.Accounts.User.html#password_changeset/3"},{"type":"function","title":"Options - Lightning.Accounts.User.password_changeset/3","doc":"* `:hash_password` - Hashes the password so it can be stored securely\n in the database and ensures the password field is cleared to prevent\n leaks in the logs. If password hashing is not needed and clearing the\n password field is not desired (like when using this changeset for\n validations on a LiveView form), this option can be set to `false`.\n Defaults to `true`.","ref":"Lightning.Accounts.User.html#password_changeset/3-options"},{"type":"function","title":"Lightning.Accounts.User.remove_github_token_changeset/1","doc":"","ref":"Lightning.Accounts.User.html#remove_github_token_changeset/1"},{"type":"function","title":"Lightning.Accounts.User.scheduled_deletion_changeset/2","doc":"A user changeset for changing the scheduled_deletion property.","ref":"Lightning.Accounts.User.html#scheduled_deletion_changeset/2"},{"type":"function","title":"Lightning.Accounts.User.superuser_registration_changeset/2","doc":"A superuser changeset for registration.\n\nIt is important to validate the length of both email and password.\nOtherwise databases may truncate the email without warnings, which\ncould lead to unpredictable or insecure behaviour. Long passwords may\nalso be very expensive to hash for certain algorithms.","ref":"Lightning.Accounts.User.html#superuser_registration_changeset/2"},{"type":"function","title":"Options - Lightning.Accounts.User.superuser_registration_changeset/2","doc":"* `:hash_password` - Hashes the password so it can be stored securely\n in the database and ensures the password field is cleared to prevent\n leaks in the logs. If password hashing is not needed and clearing the\n password field is not desired (like when using this changeset for\n validations on a LiveView form), this option can be set to `false`.\n Defaults to `true`.","ref":"Lightning.Accounts.User.html#superuser_registration_changeset/2-options"},{"type":"function","title":"Lightning.Accounts.User.user_registration_changeset/2","doc":"A user changeset for registration.\n\nIt is important to validate the length of both email and password.\nOtherwise databases may truncate the email without warnings, which\ncould lead to unpredictable or insecure behaviour. Long passwords may\nalso be very expensive to hash for certain algorithms.","ref":"Lightning.Accounts.User.html#user_registration_changeset/2"},{"type":"function","title":"Options - Lightning.Accounts.User.user_registration_changeset/2","doc":"* `:hash_password` - Hashes the password so it can be stored securely\n in the database and ensures the password field is cleared to prevent\n leaks in the logs. If password hashing is not needed and clearing the\n password field is not desired (like when using this changeset for\n validations on a LiveView form), this option can be set to `false`.\n Defaults to `true`.","ref":"Lightning.Accounts.User.html#user_registration_changeset/2-options"},{"type":"function","title":"Lightning.Accounts.User.valid_password?/2","doc":"Verifies the password.\n\nIf there is no user or the user doesn't have a password, we call\n`Bcrypt.no_user_verify/0` to avoid timing attacks.","ref":"Lightning.Accounts.User.html#valid_password?/2"},{"type":"function","title":"Lightning.Accounts.User.validate_current_password/2","doc":"Validates the current password otherwise adds an error to the changeset.","ref":"Lightning.Accounts.User.html#validate_current_password/2"},{"type":"function","title":"Lightning.Accounts.User.validate_email/1","doc":"","ref":"Lightning.Accounts.User.html#validate_email/1"},{"type":"type","title":"Lightning.Accounts.User.t/0","doc":"","ref":"Lightning.Accounts.User.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.User.RolesEnum","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.cast/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.create_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.dump/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.embed_as/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.equal?/2","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.load/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schema/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.type/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Accounts.User.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Accounts.User.RolesEnum.t/0","doc":"","ref":"Lightning.Accounts.User.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserBackupCode","doc":"User backup codes schema","ref":"Lightning.Accounts.UserBackupCode.html"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.changeset/2","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserBackupCode.generate_backup_code/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#generate_backup_code/0"},{"type":"type","title":"Lightning.Accounts.UserBackupCode.t/0","doc":"","ref":"Lightning.Accounts.UserBackupCode.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserNotifier","doc":"The UserNotifier module.","ref":"Lightning.Accounts.UserNotifier.html"},{"type":"function","title":"Lightning.Accounts.UserNotifier.build_digest_url/3","doc":"","ref":"Lightning.Accounts.UserNotifier.html#build_digest_url/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/2","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_confirmation_instructions/3","doc":"Deliver instructions to confirm account.","ref":"Lightning.Accounts.UserNotifier.html#deliver_confirmation_instructions/3"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_addition_notification/2","doc":"Deliver email to notify user of his addition of a project.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_addition_notification/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_digest/2","doc":"Deliver a project digest of daily/weekly or monthly activity to a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_digest/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_project_invitation_email/5","doc":"","ref":"Lightning.Accounts.UserNotifier.html#deliver_project_invitation_email/5"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_reset_password_instructions/2","doc":"Deliver instructions to reset a user password.","ref":"Lightning.Accounts.UserNotifier.html#deliver_reset_password_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_instructions/2","doc":"Deliver instructions to update a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_instructions/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.deliver_update_email_warning/2","doc":"Deliver warning to update a user.","ref":"Lightning.Accounts.UserNotifier.html#deliver_update_email_warning/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.notify_history_export_completion/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#notify_history_export_completion/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.notify_project_deletion/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#notify_project_deletion/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.remind_account_confirmation/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#remind_account_confirmation/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_credential_deletion_notification_email/2","doc":"","ref":"Lightning.Accounts.UserNotifier.html#send_credential_deletion_notification_email/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_data_retention_change_email/2","doc":"Deliver an email to notify the user about a data retention setting change made in their project","ref":"Lightning.Accounts.UserNotifier.html#send_data_retention_change_email/2"},{"type":"function","title":"Lightning.Accounts.UserNotifier.send_deletion_notification_email/1","doc":"Deliver an email to notify the user about their account being deleted","ref":"Lightning.Accounts.UserNotifier.html#send_deletion_notification_email/1"},{"type":"module","title":"Lightning.Accounts.UserTOTP","doc":"User Time based OTPs schema","ref":"Lightning.Accounts.UserTOTP.html"},{"type":"function","title":"Lightning.Accounts.UserTOTP.changeset/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserTOTP.valid_totp?/2","doc":"","ref":"Lightning.Accounts.UserTOTP.html#valid_totp?/2"},{"type":"type","title":"Lightning.Accounts.UserTOTP.t/0","doc":"","ref":"Lightning.Accounts.UserTOTP.html#t:t/0"},{"type":"module","title":"Lightning.Accounts.UserToken","doc":"The UserToken model.\n\nThe reason why we store session tokens in the database, even\nthough Phoenix already provides a session cookie, is because\nPhoenix' default session cookies are not persisted, they are\nsimply signed and potentially encrypted. This means they are\nvalid indefinitely, unless you change the signing/encryption\nsalt.\n\nTherefore, storing them allows individual user\nsessions to be expired. The token system can also be extended\nto store additional data, such as the device used for logging in.\nYou could then use this information to display all valid sessions\nand devices in the UI and allow users to explicitly expire any\nsession they deem invalid.","ref":"Lightning.Accounts.UserToken.html"},{"type":"function","title":"Lightning.Accounts.UserToken.build_email_token/3","doc":"Builds a token and its hash to be delivered to the user's email.\n\nThe non-hashed token is sent to the user email while the\nhashed part is stored in the database. The original token cannot be reconstructed,\nwhich means anyone with read-only access to the database cannot directly use\nthe token in the application to gain access. Furthermore, if the user changes\ntheir email in the system, the tokens sent to the previous email are no longer\nvalid.\n\nUsers can easily adapt the existing code to provide other types of delivery methods,\nfor example, by phone numbers.","ref":"Lightning.Accounts.UserToken.html#build_email_token/3"},{"type":"function","title":"Lightning.Accounts.UserToken.build_token/2","doc":"Generates a token that will be stored in a signed place,\nsuch as session or cookie. As they are signed, those\ntokens do not need to be hashed.","ref":"Lightning.Accounts.UserToken.html#build_token/2"},{"type":"function","title":"Lightning.Accounts.UserToken.changeset/2","doc":"","ref":"Lightning.Accounts.UserToken.html#changeset/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.Accounts.UserToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Accounts.UserToken.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.Accounts.UserToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Accounts.UserToken.last_used_changeset/1","doc":"Update when the api token was last used by setting`last_used_at`.","ref":"Lightning.Accounts.UserToken.html#last_used_changeset/1"},{"type":"function","title":"Lightning.Accounts.UserToken.token_and_context_query/2","doc":"Returns the token struct for the given token value and context.","ref":"Lightning.Accounts.UserToken.html#token_and_context_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.user_and_contexts_query/2","doc":"Gets all tokens for the given user for the given contexts.","ref":"Lightning.Accounts.UserToken.html#user_and_contexts_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.Accounts.UserToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.Accounts.UserToken.html#verify_and_validate!/3"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_change_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query.\n\nThe query returns the user found by the token, if any.\n\nThis is used to validate requests to change the user\nemail. It is different from `verify_email_token_query/2` precisely because\n`verify_email_token_query/2` validates the email has not changed, which is\nthe starting point by this function.\n\nThe given token is valid if it matches its hashed counterpart in the\ndatabase and if it has not expired (after @change_email_validity_in_days).\nThe context must always start with \"change:\".","ref":"Lightning.Accounts.UserToken.html#verify_change_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_email_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query.\n\nThe query returns the user found by the token, if any.\n\nThe given token is valid if it matches its hashed counterpart in the\ndatabase and the user email has not changed. This function also checks\nif the token is being used within a certain period, depending on the\ncontext. The default contexts supported by this function are either\n\"confirm\", for account confirmation emails, and \"reset_password\",\nfor resetting the password. For verifying requests to change the email,\nsee `verify_change_email_token_query/2`.","ref":"Lightning.Accounts.UserToken.html#verify_email_token_query/2"},{"type":"function","title":"Lightning.Accounts.UserToken.verify_token_query/2","doc":"Checks if the token is valid and returns its underlying lookup query.\n\nThe query returns the user found by the token, if any.\n\nThe token is valid if it matches the value in the database and it has\nnot expired (after @auth_validity_in_seconds or @session_validity_in_days).","ref":"Lightning.Accounts.UserToken.html#verify_token_query/2"},{"type":"behaviour","title":"Lightning.Config","doc":"Centralised runtime configuration for Lightning.","ref":"Lightning.Config.html"},{"type":"function","title":"Lightning.Config.apollo/1","doc":"Returns the Apollo server configuration.","ref":"Lightning.Config.html#apollo/1"},{"type":"callback","title":"Lightning.Config.apollo/1","doc":"","ref":"Lightning.Config.html#c:apollo/1"},{"type":"function","title":"Lightning.Config.check_flag?/1","doc":"","ref":"Lightning.Config.html#check_flag?/1"},{"type":"callback","title":"Lightning.Config.check_flag?/1","doc":"","ref":"Lightning.Config.html#c:check_flag?/1"},{"type":"function","title":"Lightning.Config.cors_origin/0","doc":"","ref":"Lightning.Config.html#cors_origin/0"},{"type":"callback","title":"Lightning.Config.cors_origin/0","doc":"","ref":"Lightning.Config.html#c:cors_origin/0"},{"type":"function","title":"Lightning.Config.default_max_run_duration/0","doc":"Returns the default maximum run duration in seconds.","ref":"Lightning.Config.html#default_max_run_duration/0"},{"type":"callback","title":"Lightning.Config.default_max_run_duration/0","doc":"","ref":"Lightning.Config.html#c:default_max_run_duration/0"},{"type":"function","title":"Lightning.Config.email_sender_name/0","doc":"","ref":"Lightning.Config.html#email_sender_name/0"},{"type":"callback","title":"Lightning.Config.email_sender_name/0","doc":"","ref":"Lightning.Config.html#c:email_sender_name/0"},{"type":"function","title":"Lightning.Config.get_extension_mod/1","doc":"","ref":"Lightning.Config.html#get_extension_mod/1"},{"type":"callback","title":"Lightning.Config.get_extension_mod/1","doc":"","ref":"Lightning.Config.html#c:get_extension_mod/1"},{"type":"function","title":"Lightning.Config.google/1","doc":"","ref":"Lightning.Config.html#google/1"},{"type":"callback","title":"Lightning.Config.google/1","doc":"","ref":"Lightning.Config.html#c:google/1"},{"type":"function","title":"Lightning.Config.grace_period/0","doc":"The grace period is configurable and is used to wait for an additional\namount of time after a given run was meant to be finished.\n\nThe returned value is in seconds.","ref":"Lightning.Config.html#grace_period/0"},{"type":"callback","title":"Lightning.Config.grace_period/0","doc":"","ref":"Lightning.Config.html#c:grace_period/0"},{"type":"function","title":"Lightning.Config.instance_admin_email/0","doc":"","ref":"Lightning.Config.html#instance_admin_email/0"},{"type":"callback","title":"Lightning.Config.instance_admin_email/0","doc":"","ref":"Lightning.Config.html#c:instance_admin_email/0"},{"type":"function","title":"Lightning.Config.kafka_duplicate_tracking_retention_seconds/0","doc":"","ref":"Lightning.Config.html#kafka_duplicate_tracking_retention_seconds/0"},{"type":"callback","title":"Lightning.Config.kafka_duplicate_tracking_retention_seconds/0","doc":"","ref":"Lightning.Config.html#c:kafka_duplicate_tracking_retention_seconds/0"},{"type":"function","title":"Lightning.Config.kafka_number_of_consumers/0","doc":"","ref":"Lightning.Config.html#kafka_number_of_consumers/0"},{"type":"callback","title":"Lightning.Config.kafka_number_of_consumers/0","doc":"","ref":"Lightning.Config.html#c:kafka_number_of_consumers/0"},{"type":"function","title":"Lightning.Config.kafka_number_of_messages_per_second/0","doc":"","ref":"Lightning.Config.html#kafka_number_of_messages_per_second/0"},{"type":"callback","title":"Lightning.Config.kafka_number_of_messages_per_second/0","doc":"","ref":"Lightning.Config.html#c:kafka_number_of_messages_per_second/0"},{"type":"function","title":"Lightning.Config.kafka_number_of_processors/0","doc":"","ref":"Lightning.Config.html#kafka_number_of_processors/0"},{"type":"callback","title":"Lightning.Config.kafka_number_of_processors/0","doc":"","ref":"Lightning.Config.html#c:kafka_number_of_processors/0"},{"type":"function","title":"Lightning.Config.kafka_triggers_enabled?/0","doc":"","ref":"Lightning.Config.html#kafka_triggers_enabled?/0"},{"type":"callback","title":"Lightning.Config.kafka_triggers_enabled?/0","doc":"","ref":"Lightning.Config.html#c:kafka_triggers_enabled?/0"},{"type":"function","title":"Lightning.Config.oauth_provider/1","doc":"","ref":"Lightning.Config.html#oauth_provider/1"},{"type":"callback","title":"Lightning.Config.oauth_provider/1","doc":"","ref":"Lightning.Config.html#c:oauth_provider/1"},{"type":"function","title":"Lightning.Config.purge_deleted_after_days/0","doc":"","ref":"Lightning.Config.html#purge_deleted_after_days/0"},{"type":"callback","title":"Lightning.Config.purge_deleted_after_days/0","doc":"","ref":"Lightning.Config.html#c:purge_deleted_after_days/0"},{"type":"function","title":"Lightning.Config.repo_connection_token_signer/0","doc":"","ref":"Lightning.Config.html#repo_connection_token_signer/0"},{"type":"callback","title":"Lightning.Config.repo_connection_token_signer/0","doc":"","ref":"Lightning.Config.html#c:repo_connection_token_signer/0"},{"type":"function","title":"Lightning.Config.reset_password_token_validity_in_days/0","doc":"","ref":"Lightning.Config.html#reset_password_token_validity_in_days/0"},{"type":"callback","title":"Lightning.Config.reset_password_token_validity_in_days/0","doc":"","ref":"Lightning.Config.html#c:reset_password_token_validity_in_days/0"},{"type":"function","title":"Lightning.Config.run_token_signer/0","doc":"Returns the Token signer used to sign and verify run tokens.","ref":"Lightning.Config.html#run_token_signer/0"},{"type":"callback","title":"Lightning.Config.run_token_signer/0","doc":"","ref":"Lightning.Config.html#c:run_token_signer/0"},{"type":"function","title":"Lightning.Config.storage/0","doc":"","ref":"Lightning.Config.html#storage/0"},{"type":"callback","title":"Lightning.Config.storage/0","doc":"","ref":"Lightning.Config.html#c:storage/0"},{"type":"function","title":"Lightning.Config.storage/1","doc":"","ref":"Lightning.Config.html#storage/1"},{"type":"callback","title":"Lightning.Config.storage/1","doc":"","ref":"Lightning.Config.html#c:storage/1"},{"type":"function","title":"Lightning.Config.usage_tracking/0","doc":"","ref":"Lightning.Config.html#usage_tracking/0"},{"type":"callback","title":"Lightning.Config.usage_tracking/0","doc":"","ref":"Lightning.Config.html#c:usage_tracking/0"},{"type":"function","title":"Lightning.Config.usage_tracking_cron_opts/0","doc":"","ref":"Lightning.Config.html#usage_tracking_cron_opts/0"},{"type":"callback","title":"Lightning.Config.usage_tracking_cron_opts/0","doc":"","ref":"Lightning.Config.html#c:usage_tracking_cron_opts/0"},{"type":"function","title":"Lightning.Config.worker_secret/0","doc":"","ref":"Lightning.Config.html#worker_secret/0"},{"type":"callback","title":"Lightning.Config.worker_secret/0","doc":"","ref":"Lightning.Config.html#c:worker_secret/0"},{"type":"function","title":"Lightning.Config.worker_token_signer/0","doc":"Returns the Token signer used to verify worker tokens.","ref":"Lightning.Config.html#worker_token_signer/0"},{"type":"callback","title":"Lightning.Config.worker_token_signer/0","doc":"","ref":"Lightning.Config.html#c:worker_token_signer/0"},{"type":"module","title":"Lightning.Config.Bootstrap","doc":"Bootstrap the application environment.\n\nThis module is responsible for setting up the application environment based on\nthe configuration provided by the user.\n\nUsually, config calls are made in the `config/runtime.exs` file. This module\nabstracts the runtime configuration into a module that can be tested and\ncalled from other places (aside from `config/runtime.exs`) file.\n\n> ##","ref":"Lightning.Config.Bootstrap.html"},{"type":"module","title":"Sourcing envs {: .info} - Lightning.Config.Bootstrap","doc":">\n> Internally this module uses `Dotenvy.source/1` to source environment variables\n> from the `.env`, `.env. `, and `.env. .override` files.\n> It also sources the system environment variables.\n>\n> Calling `configure/0` without calling `source_envs/0` or `Dotenvy.source/2`\n> first will result in no environment variables being loaded.\n\nUsage:\n\n```elixir\nLightning.Config.Bootstrap.source_envs()\nLightning.Config.Bootstrap.configure()\n```","ref":"Lightning.Config.Bootstrap.html#module-sourcing-envs-info"},{"type":"function","title":"Lightning.Config.Bootstrap.configure/0","doc":"","ref":"Lightning.Config.Bootstrap.html#configure/0"},{"type":"function","title":"Lightning.Config.Bootstrap.source_envs/0","doc":"","ref":"Lightning.Config.Bootstrap.html#source_envs/0"},{"type":"module","title":"Lightning.Config.Utils","doc":"Utility functions for working with the application environment.","ref":"Lightning.Config.Utils.html"},{"type":"function","title":"Lightning.Config.Utils.ensure_boolean/1","doc":"","ref":"Lightning.Config.Utils.html#ensure_boolean/1"},{"type":"function","title":"Lightning.Config.Utils.get_env/2","doc":"Retrieve a value nested in the application environment.","ref":"Lightning.Config.Utils.html#get_env/2"},{"type":"module","title":"Lightning.Runs","doc":"Gathers operations to create, update and delete Runs.","ref":"Lightning.Runs.html"},{"type":"function","title":"Lightning.Runs.append_run_log/3","doc":"","ref":"Lightning.Runs.html#append_run_log/3"},{"type":"function","title":"Lightning.Runs.complete_run/2","doc":"","ref":"Lightning.Runs.html#complete_run/2"},{"type":"function","title":"Lightning.Runs.complete_step/2","doc":"","ref":"Lightning.Runs.html#complete_step/2"},{"type":"function","title":"Lightning.Runs.enqueue/1","doc":"Enqueue a run to be processed.","ref":"Lightning.Runs.html#enqueue/1"},{"type":"function","title":"Lightning.Runs.get/2","doc":"Get a run by id.\n\nOptionally preload associations by passing a list of atoms to `:include`.\n\n Lightning.Runs.get(id, include: [:workflow])","ref":"Lightning.Runs.html#get/2"},{"type":"function","title":"Lightning.Runs.get_credential/2","doc":"","ref":"Lightning.Runs.html#get_credential/2"},{"type":"function","title":"Lightning.Runs.get_dataclip_body/1","doc":"Returns only the dataclip body as a string","ref":"Lightning.Runs.html#get_dataclip_body/1"},{"type":"function","title":"Lightning.Runs.get_dataclip_request/1","doc":"Returns only the dataclip request as a string","ref":"Lightning.Runs.html#get_dataclip_request/1"},{"type":"function","title":"Lightning.Runs.get_for_worker/1","doc":"Get a run by id, preloading the snapshot and its credential.","ref":"Lightning.Runs.html#get_for_worker/1"},{"type":"function","title":"Lightning.Runs.get_input/1","doc":"Returns a run's dataclip formatted for use as state.\n\nOnly `http_request` and kafka dataclips are changed,\ntheir `body` is nested inside a `\"data\"` key and `request` data\nis added as a `\"request\"` key.\n\nSee LightingWeb.RunChannel.handle_in(\"fetch:dataclip\", _, _)\nfor more details.","ref":"Lightning.Runs.html#get_input/1"},{"type":"function","title":"Lightning.Runs.get_log_lines/2","doc":"","ref":"Lightning.Runs.html#get_log_lines/2"},{"type":"function","title":"Lightning.Runs.get_project_id_for_run/1","doc":"","ref":"Lightning.Runs.html#get_project_id_for_run/1"},{"type":"function","title":"Lightning.Runs.mark_run_lost/1","doc":"","ref":"Lightning.Runs.html#mark_run_lost/1"},{"type":"function","title":"Lightning.Runs.mark_steps_lost/1","doc":"","ref":"Lightning.Runs.html#mark_steps_lost/1"},{"type":"function","title":"Lightning.Runs.start_run/2","doc":"","ref":"Lightning.Runs.html#start_run/2"},{"type":"function","title":"Lightning.Runs.start_step/2","doc":"Creates a Step for a given run and job.\n\nThe Step is created and marked as started at the current time.","ref":"Lightning.Runs.html#start_step/2"},{"type":"function","title":"Lightning.Runs.subscribe/1","doc":"","ref":"Lightning.Runs.html#subscribe/1"},{"type":"function","title":"Lightning.Runs.update_run/1","doc":"","ref":"Lightning.Runs.html#update_run/1"},{"type":"function","title":"Lightning.Runs.update_runs/2","doc":"","ref":"Lightning.Runs.html#update_runs/2"},{"type":"function","title":"Lightning.Runs.wipe_dataclips/1","doc":"Clears the body and request fields of the dataclip associated with the given run.","ref":"Lightning.Runs.html#wipe_dataclips/1"},{"type":"module","title":"Lightning.Runs.Events","doc":"","ref":"Lightning.Runs.Events.html"},{"type":"function","title":"Lightning.Runs.Events.dataclip_updated/2","doc":"","ref":"Lightning.Runs.Events.html#dataclip_updated/2"},{"type":"function","title":"Lightning.Runs.Events.log_appended/1","doc":"","ref":"Lightning.Runs.Events.html#log_appended/1"},{"type":"function","title":"Lightning.Runs.Events.run_updated/1","doc":"","ref":"Lightning.Runs.Events.html#run_updated/1"},{"type":"function","title":"Lightning.Runs.Events.step_completed/2","doc":"","ref":"Lightning.Runs.Events.html#step_completed/2"},{"type":"function","title":"Lightning.Runs.Events.step_started/2","doc":"","ref":"Lightning.Runs.Events.html#step_started/2"},{"type":"function","title":"Lightning.Runs.Events.subscribe/1","doc":"","ref":"Lightning.Runs.Events.html#subscribe/1"},{"type":"module","title":"Lightning.Runs.Handlers","doc":"Handler modules for working with runs.","ref":"Lightning.Runs.Handlers.html"},{"type":"module","title":"Lightning.Runs.Handlers.CompleteRun","doc":"Schema to validate the input attributes of a completed run.","ref":"Lightning.Runs.Handlers.CompleteRun.html"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteRun.call/2","doc":"","ref":"Lightning.Runs.Handlers.CompleteRun.html#call/2"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteRun.new/1","doc":"","ref":"Lightning.Runs.Handlers.CompleteRun.html#new/1"},{"type":"module","title":"Lightning.Runs.Handlers.CompleteStep","doc":"Schema to validate the input attributes of a completed step.","ref":"Lightning.Runs.Handlers.CompleteStep.html"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteStep.call/2","doc":"","ref":"Lightning.Runs.Handlers.CompleteStep.html#call/2"},{"type":"function","title":"Lightning.Runs.Handlers.CompleteStep.new/2","doc":"","ref":"Lightning.Runs.Handlers.CompleteStep.html#new/2"},{"type":"module","title":"Lightning.Runs.Handlers.StartRun","doc":"Schema to validate the input attributes of a started run.","ref":"Lightning.Runs.Handlers.StartRun.html"},{"type":"function","title":"Lightning.Runs.Handlers.StartRun.call/2","doc":"","ref":"Lightning.Runs.Handlers.StartRun.html#call/2"},{"type":"function","title":"Lightning.Runs.Handlers.StartRun.new/1","doc":"","ref":"Lightning.Runs.Handlers.StartRun.html#new/1"},{"type":"module","title":"Lightning.Runs.Handlers.StartStep","doc":"Schema to validate the input attributes of a started step.","ref":"Lightning.Runs.Handlers.StartStep.html"},{"type":"function","title":"Lightning.Runs.Handlers.StartStep.call/2","doc":"","ref":"Lightning.Runs.Handlers.StartStep.html#call/2"},{"type":"module","title":"Lightning.Runs.PromExPlugin","doc":"Metrics callbacks implementation for the PromEx plugin.\n\nEvent metrics are used to publish the dispatched events in the system.\nPolling metrics are used to publish metrics that are calculated by polling data periodically.","ref":"Lightning.Runs.PromExPlugin.html"},{"type":"function","title":"Lightning.Runs.PromExPlugin.calculate_average_claim_duration/2","doc":"","ref":"Lightning.Runs.PromExPlugin.html#calculate_average_claim_duration/2"},{"type":"function","title":"Lightning.Runs.PromExPlugin.count_finalised_runs/1","doc":"","ref":"Lightning.Runs.PromExPlugin.html#count_finalised_runs/1"},{"type":"function","title":"Lightning.Runs.PromExPlugin.run_queue_metrics/2","doc":"","ref":"Lightning.Runs.PromExPlugin.html#run_queue_metrics/2"},{"type":"function","title":"Lightning.Runs.PromExPlugin.stalled_run_count/1","doc":"","ref":"Lightning.Runs.PromExPlugin.html#stalled_run_count/1"},{"type":"module","title":"Lightning.Runs.Query","doc":"Query functions for working with Runs","ref":"Lightning.Runs.Query.html"},{"type":"function","title":"Lightning.Runs.Query.eligible_for_claim/0","doc":"Query to return runs that are eligible for claiming.\n\nUses `in_progress_window/0` and filters for runs that are either in the\navailable state and have not reached the concurrency limit for their workflow.\n\n> #","ref":"Lightning.Runs.Query.html#eligible_for_claim/0"},{"type":"function","title":"Note {: .info} - Lightning.Runs.Query.eligible_for_claim/0","doc":"> This query does not currently take into account the priority of the run.\n> To allow for prioritization, the query should be updated to order by\n> priority.\n>\n> ```elixir\n> eligible_for_claim() |> prepend_order_by([:priority])\n> ```","ref":"Lightning.Runs.Query.html#eligible_for_claim/0-note-info"},{"type":"function","title":"Lightning.Runs.Query.in_progress_window/0","doc":"Query to return a list of runs that are either in progress (started or claimed)\nor available.\n\nThe select clause includes:\n- `id`, the id of the run\n- `state`, the state of the run\n- `row_number`, the number of the row in the window, per workflow\n- `limit`, the maximum number of runs that can be claimed for the workflow","ref":"Lightning.Runs.Query.html#in_progress_window/0"},{"type":"function","title":"Lightning.Runs.Query.lost/0","doc":"Return all runs that have been claimed by a worker before the earliest\nacceptable start time (determined by the run options and grace period) but are\nstill incomplete.\n\nThis indicates that we may have lost contact with the worker\nthat was responsible for executing the run.","ref":"Lightning.Runs.Query.html#lost/0"},{"type":"function","title":"Lightning.Runs.Query.lost_steps/0","doc":"","ref":"Lightning.Runs.Query.html#lost_steps/0"},{"type":"module","title":"Lightning.Runs.Queue","doc":"Allows adding, removing or claiming work to be executed by the Runtime.","ref":"Lightning.Runs.Queue.html"},{"type":"function","title":"Lightning.Runs.Queue.claim/2","doc":"","ref":"Lightning.Runs.Queue.html#claim/2"},{"type":"module","title":"Lightning.Runs.RunOptions","doc":"Options that are passed to the worker to control configurable limits and\nbehaviors during run execution and reporting.","ref":"Lightning.Runs.RunOptions.html"},{"type":"type","title":"Lightning.Runs.RunOptions.keyword_list/0","doc":"","ref":"Lightning.Runs.RunOptions.html#t:keyword_list/0"},{"type":"type","title":"Lightning.Runs.RunOptions.t/0","doc":"","ref":"Lightning.Runs.RunOptions.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrders","doc":"Context for creating WorkOrders.","ref":"Lightning.WorkOrders.html"},{"type":"module","title":"Work Orders - Lightning.WorkOrders","doc":"Work Orders represent the entrypoint for a unit of work in Lightning.\nThey allow you to track the status of a webhook or cron trigger.\n\nFor example if a user makes a request to a webhook endpoint, a Work Order\nis created with it's associated Workflow and Dataclip.\n\nEvery Work Order has at least one Run, which represents a single\ninvocation of the Workflow. If the workflow fails, and the run is retried,\na new Run is created on the Work Order.\n\nThis allows you group all the runs for a single webhook, and track\nthe success or failure of a given dataclip.","ref":"Lightning.WorkOrders.html#module-work-orders"},{"type":"module","title":"Creating Work Orders - Lightning.WorkOrders","doc":"Work Orders can be created in three ways:\n\n1. Via a webhook trigger\n2. Via a cron trigger\n3. Manually by a user (via the UI or API)\n\nRetries do not create new Work Orders, but rather new Runs on the existing\nWork Order.","ref":"Lightning.WorkOrders.html#module-creating-work-orders"},{"type":"function","title":"Lightning.WorkOrders.build/1","doc":"","ref":"Lightning.WorkOrders.html#build/1"},{"type":"function","title":"Lightning.WorkOrders.build_for/2","doc":"","ref":"Lightning.WorkOrders.html#build_for/2"},{"type":"function","title":"Lightning.WorkOrders.create_for/1","doc":"","ref":"Lightning.WorkOrders.html#create_for/1"},{"type":"function","title":"Lightning.WorkOrders.create_for/3","doc":"Create a new Work Order.\n\n**For a webhook**\n create_for(trigger, workflow: workflow, dataclip: dataclip)\n\n**For a user**\n create_for(job, workflow: workflow, dataclip: dataclip, user: user)","ref":"Lightning.WorkOrders.html#create_for/3"},{"type":"function","title":"Lightning.WorkOrders.enqueue_many_for_retry/2","doc":"Enqueue multiple runs for retry in the same transaction.","ref":"Lightning.WorkOrders.html#enqueue_many_for_retry/2"},{"type":"function","title":"Lightning.WorkOrders.get/2","doc":"Get a Work Order by id.\n\nOptionally preload associations by passing a list of atoms to `:include`.\n\n Lightning.WorkOrders.get(id, include: [:runs])","ref":"Lightning.WorkOrders.html#get/2"},{"type":"function","title":"Lightning.WorkOrders.retry/3","doc":"Retry a run from a given step.\n\nThis will create a new Run on the Work Order, and enqueue it for\nprocessing.\n\nWhen creating a new Run, a graph of the workflow is created steps that are\nindependent from the selected step and its downstream flow are associated with\nthis new run, but not executed again.","ref":"Lightning.WorkOrders.html#retry/3"},{"type":"function","title":"Lightning.WorkOrders.retry_many/2","doc":"","ref":"Lightning.WorkOrders.html#retry_many/2"},{"type":"function","title":"Lightning.WorkOrders.retry_many/3","doc":"","ref":"Lightning.WorkOrders.html#retry_many/3"},{"type":"function","title":"Lightning.WorkOrders.subscribe/1","doc":"","ref":"Lightning.WorkOrders.html#subscribe/1"},{"type":"function","title":"Lightning.WorkOrders.update_state/1","doc":"Updates the state of a WorkOrder based on the state of a run.\n\nThis considers the state of all runs on the WorkOrder, with the\nRun passed in as the latest run.\n\nSee `Lightning.WorkOrders.Query.state_for/1` for more details.","ref":"Lightning.WorkOrders.html#update_state/1"},{"type":"type","title":"Lightning.WorkOrders.work_order_option/0","doc":"","ref":"Lightning.WorkOrders.html#t:work_order_option/0"},{"type":"module","title":"Lightning.WorkOrders.ExportWorker","doc":"This module handles the export of work orders for a given project. The export process is performed asynchronously using the Oban background job system.","ref":"Lightning.WorkOrders.ExportWorker.html"},{"type":"module","title":"Responsibilities - Lightning.WorkOrders.ExportWorker","doc":"- **Enqueueing Export Jobs**: The `enqueue_export/2` function creates and enqueues an Oban job for exporting work orders based on the given project and search parameters.\n - **Processing Exports**: The `perform/1` function is the main entry point for executing the export job. It retrieves the project, processes work orders, and handles the export process.\n - **Export Logic**: The export logic involves querying work orders, extracting relevant entities, processing logs and dataclips asynchronously, and writing the final export data to files.\n - **Error Handling**: The module includes comprehensive error handling and logging to ensure that issues during the export process are recorded and can be diagnosed.\n - **Zip File Creation**: After processing, the exported files are compressed into a zip file for easy download or further use.","ref":"Lightning.WorkOrders.ExportWorker.html#module-responsibilities"},{"type":"module","title":"Usage - Lightning.WorkOrders.ExportWorker","doc":"- To enqueue an export job, call `enqueue_export/2` with the project and search parameters.\n - The export process is triggered by Oban and runs in the `history_exports` queue, limited to a single attempt per job.","ref":"Lightning.WorkOrders.ExportWorker.html#module-usage"},{"type":"module","title":"Example - Lightning.WorkOrders.ExportWorker","doc":"```elixir\n # Enqueue an export job\n Lightning.WorkOrders.ExportWorker.enqueue_export(project, search_params)\n\n # The job will run in the background and log the status of the export process.\n ```\n\n This module is designed to handle potentially large datasets efficiently by using streaming, async processing, and error recovery mechanisms.","ref":"Lightning.WorkOrders.ExportWorker.html#module-example"},{"type":"function","title":"Lightning.WorkOrders.ExportWorker.enqueue_export/3","doc":"","ref":"Lightning.WorkOrders.ExportWorker.html#enqueue_export/3"},{"type":"function","title":"Lightning.WorkOrders.ExportWorker.extract_entities/1","doc":"","ref":"Lightning.WorkOrders.ExportWorker.html#extract_entities/1"},{"type":"function","title":"Lightning.WorkOrders.ExportWorker.fetch_dataclips/1","doc":"","ref":"Lightning.WorkOrders.ExportWorker.html#fetch_dataclips/1"},{"type":"module","title":"Lightning.WorkOrders.Manual","doc":"A model is used to build WorkOrders with custom input data.","ref":"Lightning.WorkOrders.Manual.html"},{"type":"function","title":"Lightning.WorkOrders.Manual.new/2","doc":"","ref":"Lightning.WorkOrders.Manual.html#new/2"},{"type":"type","title":"Lightning.WorkOrders.Manual.t/0","doc":"","ref":"Lightning.WorkOrders.Manual.html#t:t/0"},{"type":"module","title":"Lightning.WorkOrders.Query","doc":"Query functions for the Lightning.WorkOrders module.","ref":"Lightning.WorkOrders.Query.html"},{"type":"function","title":"Lightning.WorkOrders.Query.state_for/1","doc":"Query to calculate the current state of a workorder.\n\nIt takes a run, as the state is updated after each run is changed.\n\nThe logic is as follows:\n\n- All _other_ Runs that are not in a finished state are considered first.\n- The current Run is unioned onto the unfinished runs with a null\n ordinality.\n- The runs are ordered by state in the following order\n `started > available > claimed > null`\n- The run states are then mapped to the workorder state enum, so `available`\n and `claimed` are both mapped to `pending` and `started` is mapped to `running`\n\n> The `null` ordinality ensures that the current run is always last in the\n> ordering.","ref":"Lightning.WorkOrders.Query.html#state_for/1"},{"type":"module","title":"Lightning.WorkOrders.RetryManyWorkOrdersJob","doc":"Enqueue multiple work orders for retry.","ref":"Lightning.WorkOrders.RetryManyWorkOrdersJob.html"},{"type":"module","title":"Lightning.WorkOrders.SearchParams","doc":"This module is used to parse search parameters for work orders and provide\na query to the database.","ref":"Lightning.WorkOrders.SearchParams.html"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.all_statuses_set?/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#all_statuses_set?/1"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.from_map/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#from_map/1"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.new/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#new/1"},{"type":"macro","title":"Lightning.WorkOrders.SearchParams.status_list/0","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#status_list/0"},{"type":"function","title":"Lightning.WorkOrders.SearchParams.to_uri_params/1","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#to_uri_params/1"},{"type":"type","title":"Lightning.WorkOrders.SearchParams.t/0","doc":"","ref":"Lightning.WorkOrders.SearchParams.html#t:t/0"},{"type":"module","title":"Lightning.Credentials","doc":"The Credentials context.","ref":"Lightning.Credentials.html"},{"type":"function","title":"Lightning.Credentials.basic_auth_for/1","doc":"","ref":"Lightning.Credentials.html#basic_auth_for/1"},{"type":"function","title":"Lightning.Credentials.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Credentials.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Credentials.change_credential/2","doc":"Returns an `%Ecto.Changeset{}` for tracking credential changes.","ref":"Lightning.Credentials.html#change_credential/2"},{"type":"function","title":"Examples - Lightning.Credentials.change_credential/2","doc":"iex> change_credential(credential)\n %Ecto.Changeset{data: %Credential{}}","ref":"Lightning.Credentials.html#change_credential/2-examples"},{"type":"function","title":"Lightning.Credentials.create_credential/1","doc":"Creates a credential.","ref":"Lightning.Credentials.html#create_credential/1"},{"type":"function","title":"Examples - Lightning.Credentials.create_credential/1","doc":"iex> create_credential(%{field: value})\n {:ok, %Credential{}}\n\n iex> create_credential(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#create_credential/1-examples"},{"type":"function","title":"Lightning.Credentials.delete_credential/1","doc":"Deletes a credential.","ref":"Lightning.Credentials.html#delete_credential/1"},{"type":"function","title":"Examples - Lightning.Credentials.delete_credential/1","doc":"iex> delete_credential(credential)\n {:ok, %Credential{}}\n\n iex> delete_credential(credential)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#delete_credential/1-examples"},{"type":"function","title":"Lightning.Credentials.get_credential!/1","doc":"Gets a single credential.\n\nRaises `Ecto.NoResultsError` if the Credential does not exist.","ref":"Lightning.Credentials.html#get_credential!/1"},{"type":"function","title":"Examples - Lightning.Credentials.get_credential!/1","doc":"iex> get_credential!(123)\n %Credential{}\n\n iex> get_credential!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Credentials.html#get_credential!/1-examples"},{"type":"function","title":"Lightning.Credentials.get_credential_by_project_credential/1","doc":"","ref":"Lightning.Credentials.html#get_credential_by_project_credential/1"},{"type":"function","title":"Lightning.Credentials.get_credential_for_update!/1","doc":"","ref":"Lightning.Credentials.html#get_credential_for_update!/1"},{"type":"function","title":"Lightning.Credentials.get_schema/1","doc":"Creates a credential schema from credential json schema.","ref":"Lightning.Credentials.html#get_schema/1"},{"type":"function","title":"Lightning.Credentials.has_activity_in_projects?/1","doc":"Checks if a given `Credential` has any associated `Step` activity.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1"},{"type":"function","title":"Parameters - Lightning.Credentials.has_activity_in_projects?/1","doc":"- `_credential`: A `Credential` struct. Only the `id` field is used by the function.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.has_activity_in_projects?/1","doc":"- `true` if there's at least one `Step` associated with the given `Credential`.\n - `false` otherwise.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-returns"},{"type":"function","title":"Examples - Lightning.Credentials.has_activity_in_projects?/1","doc":"iex> has_activity_in_projects?(%Credential{id: some_id})\n true\n\n iex> has_activity_in_projects?(%Credential{id: another_id})\n false","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-examples"},{"type":"function","title":"Notes - Lightning.Credentials.has_activity_in_projects?/1","doc":"This function leverages the association between `Step` and `Credential` to\ndetermine if any steps exist for a given credential. It's a fast check that\ndoes not load any records into memory, but simply checks for their existence.","ref":"Lightning.Credentials.html#has_activity_in_projects?/1-notes"},{"type":"function","title":"Lightning.Credentials.invalid_projects_for_user/2","doc":"Given a credential and a user, returns a list of invalid projects—i.e., those\nthat the credential is shared with but that the user does not have access to.\n\nThis is used to generate a validation error when a credential cannot be\ntransferred.","ref":"Lightning.Credentials.html#invalid_projects_for_user/2"},{"type":"function","title":"Examples - Lightning.Credentials.invalid_projects_for_user/2","doc":"iex> can_credential_be_shared_to_user(credential_id, user_id)\n []\n\n iex> can_credential_be_shared_to_user(credential_id, user_id)\n [\"52ea8758-6ce5-43d7-912f-6a1e1f11dc55\"]","ref":"Lightning.Credentials.html#invalid_projects_for_user/2-examples"},{"type":"function","title":"Lightning.Credentials.list_credentials/1","doc":"Retrieves all credentials based on the given context, either a Project or a User.","ref":"Lightning.Credentials.html#list_credentials/1"},{"type":"function","title":"Parameters - Lightning.Credentials.list_credentials/1","doc":"- context: The Project or User struct to retrieve credentials for.","ref":"Lightning.Credentials.html#list_credentials/1-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.list_credentials/1","doc":"- A list of credentials associated with the given Project or created by the given User.","ref":"Lightning.Credentials.html#list_credentials/1-returns"},{"type":"function","title":"Examples - Lightning.Credentials.list_credentials/1","doc":"When given a Project:\n iex> list_credentials(%Project{id: 1})\n [%Credential{project_id: 1}, %Credential{project_id: 1}]\n\n When given a User:\n iex> list_credentials(%User{id: 123})\n [%Credential{user_id: 123}, %Credential{user_id: 123}]","ref":"Lightning.Credentials.html#list_credentials/1-examples"},{"type":"function","title":"Lightning.Credentials.lookup_adapter/1","doc":"","ref":"Lightning.Credentials.html#lookup_adapter/1"},{"type":"function","title":"Lightning.Credentials.maybe_refresh_token/1","doc":"","ref":"Lightning.Credentials.html#maybe_refresh_token/1"},{"type":"function","title":"Lightning.Credentials.perform/1","doc":"Perform, when called with %{\"type\" => \"purge_deleted\"}\nwill find credentials that are ready for permanent deletion, set their bodies\nto null, and try to purge them.","ref":"Lightning.Credentials.html#perform/1"},{"type":"function","title":"Lightning.Credentials.schedule_credential_deletion/1","doc":"Schedules a given credential for deletion.\n\nThe deletion date is determined based on the `:purge_deleted_after_days` configuration\nin the application environment. If this configuration is absent, the credential is scheduled\nfor immediate deletion.\n\nThe function will also perform necessary side effects such as:\n - Removing associations of the credential.\n - Notifying the owner of the credential about the scheduled deletion.","ref":"Lightning.Credentials.html#schedule_credential_deletion/1"},{"type":"function","title":"Parameters - Lightning.Credentials.schedule_credential_deletion/1","doc":"- `credential`: A `Credential` struct that is to be scheduled for deletion.","ref":"Lightning.Credentials.html#schedule_credential_deletion/1-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.schedule_credential_deletion/1","doc":"- `{:ok, credential}`: Returns an `:ok` tuple with the updated credential struct if the\n update was successful.\n - `{:error, changeset}`: Returns an `:error` tuple with the changeset if the update failed.","ref":"Lightning.Credentials.html#schedule_credential_deletion/1-returns"},{"type":"function","title":"Examples - Lightning.Credentials.schedule_credential_deletion/1","doc":"iex> schedule_credential_deletion(%Credential{id: some_id})\n {:ok, %Credential{}}\n\n iex> schedule_credential_deletion(%Credential{})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#schedule_credential_deletion/1-examples"},{"type":"function","title":"Lightning.Credentials.sensitive_values_for/1","doc":"","ref":"Lightning.Credentials.html#sensitive_values_for/1"},{"type":"function","title":"Lightning.Credentials.update_credential/2","doc":"Updates a credential.","ref":"Lightning.Credentials.html#update_credential/2"},{"type":"function","title":"Examples - Lightning.Credentials.update_credential/2","doc":"iex> update_credential(credential, %{field: new_value})\n {:ok, %Credential{}}\n\n iex> update_credential(credential, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Credentials.html#update_credential/2-examples"},{"type":"module","title":"Lightning.Credentials.Audit","doc":"Model for storing changes to Credentials","ref":"Lightning.Credentials.Audit.html"},{"type":"function","title":"Lightning.Credentials.Audit.base_query/0","doc":"","ref":"Lightning.Credentials.Audit.html#base_query/0"},{"type":"function","title":"Lightning.Credentials.Audit.event/4","doc":"","ref":"Lightning.Credentials.Audit.html#event/4"},{"type":"function","title":"Lightning.Credentials.Audit.save/1","doc":"","ref":"Lightning.Credentials.Audit.html#save/1"},{"type":"function","title":"Lightning.Credentials.Audit.update_changes/1","doc":"","ref":"Lightning.Credentials.Audit.html#update_changes/1"},{"type":"module","title":"Lightning.Credentials.Credential","doc":"The Credential model.","ref":"Lightning.Credentials.Credential.html"},{"type":"type","title":"Lightning.Credentials.Credential.t/0","doc":"","ref":"Lightning.Credentials.Credential.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.OauthClient","doc":"Defines the Ecto schema for an OAuth client. This schema is responsible for representing\nOAuth client data in the database, including details such as client ID, client secret,\nand endpoints necessary for OAuth operations. It also links to associated users and\nprojects through relational fields.","ref":"Lightning.Credentials.OauthClient.html"},{"type":"function","title":"Lightning.Credentials.OauthClient.changeset/2","doc":"Builds a changeset for an OAuth client based on the provided attributes.","ref":"Lightning.Credentials.OauthClient.html#changeset/2"},{"type":"function","title":"Parameters - Lightning.Credentials.OauthClient.changeset/2","doc":"- oauth_client: The existing `%OauthClient{}` struct (or a new struct for creation).\n- attrs: A map of attributes to set on the OAuth client.","ref":"Lightning.Credentials.OauthClient.html#changeset/2-parameters"},{"type":"function","title":"Returns - Lightning.Credentials.OauthClient.changeset/2","doc":"- An `%Ecto.Changeset{}` that can be used to create or update an OAuth client.\n\nThis function validates the presence of essential fields, ensures that URLs are valid,\nand handles associations with projects through nested changesets.","ref":"Lightning.Credentials.OauthClient.html#changeset/2-returns"},{"type":"type","title":"Lightning.Credentials.OauthClient.t/0","doc":"","ref":"Lightning.Credentials.OauthClient.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.OauthClientAudit","doc":"Model for storing changes to Oauth clients","ref":"Lightning.Credentials.OauthClientAudit.html"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.base_query/0","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#base_query/0"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.event/4","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#event/4"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.save/1","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#save/1"},{"type":"function","title":"Lightning.Credentials.OauthClientAudit.update_changes/1","doc":"","ref":"Lightning.Credentials.OauthClientAudit.html#update_changes/1"},{"type":"module","title":"Lightning.Credentials.Schema","doc":"Structure that can parse JsonSchemas (using `ExJsonSchema`) and validate\nchangesets for a given schema.","ref":"Lightning.Credentials.Schema.html"},{"type":"function","title":"Lightning.Credentials.Schema.new/2","doc":"","ref":"Lightning.Credentials.Schema.html#new/2"},{"type":"function","title":"Lightning.Credentials.Schema.properties/2","doc":"","ref":"Lightning.Credentials.Schema.html#properties/2"},{"type":"function","title":"Lightning.Credentials.Schema.required?/2","doc":"","ref":"Lightning.Credentials.Schema.html#required?/2"},{"type":"function","title":"Lightning.Credentials.Schema.validate/2","doc":"","ref":"Lightning.Credentials.Schema.html#validate/2"},{"type":"type","title":"Lightning.Credentials.Schema.t/0","doc":"","ref":"Lightning.Credentials.Schema.html#t:t/0"},{"type":"module","title":"Lightning.Credentials.SchemaDocument","doc":"Provides facilities to dynamically create and validate a changeset for a given\n[Schema](`Lightning.Credentials.Schema`)","ref":"Lightning.Credentials.SchemaDocument.html"},{"type":"function","title":"Lightning.Credentials.SchemaDocument.changeset/3","doc":"","ref":"Lightning.Credentials.SchemaDocument.html#changeset/3"},{"type":"module","title":"Lightning.Credentials.SensitiveValues","doc":"Functions to pull out sensitive values inside a credential.\n\nThese values are used to scrub logs for leaked secrets.","ref":"Lightning.Credentials.SensitiveValues.html"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.flatten_map/1","doc":"Keys that are _not_ considered sensitive","ref":"Lightning.Credentials.SensitiveValues.html#flatten_map/1"},{"type":"function","title":"Lightning.Credentials.SensitiveValues.secret_values/1","doc":"Given a map, find all values allowed (via `@safe_keys`) and return them as\na list.","ref":"Lightning.Credentials.SensitiveValues.html#secret_values/1"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:pairs/0"},{"type":"type","title":"Lightning.Credentials.SensitiveValues.raw_pairs/0","doc":"","ref":"Lightning.Credentials.SensitiveValues.html#t:raw_pairs/0"},{"type":"module","title":"Lightning.Invocation","doc":"The Invocation context.","ref":"Lightning.Invocation.html"},{"type":"function","title":"Lightning.Invocation.assemble_logs_for_step/1","doc":"Return all logs for a step as a string of text, separated by new line \n breaks","ref":"Lightning.Invocation.html#assemble_logs_for_step/1"},{"type":"function","title":"Lightning.Invocation.change_dataclip/2","doc":"Returns an `%Ecto.Changeset{}` for tracking dataclip changes.","ref":"Lightning.Invocation.html#change_dataclip/2"},{"type":"function","title":"Examples - Lightning.Invocation.change_dataclip/2","doc":"iex> change_dataclip(dataclip)\n %Ecto.Changeset{data: %Dataclip{}}","ref":"Lightning.Invocation.html#change_dataclip/2-examples"},{"type":"function","title":"Lightning.Invocation.change_step/2","doc":"Returns an `%Ecto.Changeset{}` for tracking step changes.","ref":"Lightning.Invocation.html#change_step/2"},{"type":"function","title":"Examples - Lightning.Invocation.change_step/2","doc":"iex> change_step(step)\n %Ecto.Changeset{data: %Step{}}","ref":"Lightning.Invocation.html#change_step/2-examples"},{"type":"function","title":"Lightning.Invocation.count_workorders/2","doc":"","ref":"Lightning.Invocation.html#count_workorders/2"},{"type":"function","title":"Lightning.Invocation.create_dataclip/1","doc":"Creates a dataclip.","ref":"Lightning.Invocation.html#create_dataclip/1"},{"type":"function","title":"Examples - Lightning.Invocation.create_dataclip/1","doc":"iex> create_dataclip(%{field: value})\n {:ok, %Dataclip{}}\n\n iex> create_dataclip(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Invocation.html#create_dataclip/1-examples"},{"type":"function","title":"Lightning.Invocation.delete_dataclip/1","doc":"Deletes a dataclip.","ref":"Lightning.Invocation.html#delete_dataclip/1"},{"type":"function","title":"Examples - Lightning.Invocation.delete_dataclip/1","doc":"iex> delete_dataclip(dataclip)\n {:ok, %Dataclip{}}\n\n iex> delete_dataclip(dataclip)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Invocation.html#delete_dataclip/1-examples"},{"type":"function","title":"Lightning.Invocation.get_dataclip/1","doc":"Gets a single dataclip given one of:\n\n- a Dataclip uuid\n- a Step model\n\nReturns `nil` if the Dataclip does not exist.","ref":"Lightning.Invocation.html#get_dataclip/1"},{"type":"function","title":"Examples - Lightning.Invocation.get_dataclip/1","doc":"iex> get_dataclip(\"27b73932-16c7-4a72-86a3-85d805ccff98\")\n %Dataclip{}\n\n iex> get_dataclip(\"27b73932-16c7-4a72-86a3-85d805ccff98\")\n nil\n\n iex> get_dataclip(%Step{id: \"a uuid\"})\n %Dataclip{}","ref":"Lightning.Invocation.html#get_dataclip/1-examples"},{"type":"function","title":"Lightning.Invocation.get_dataclip!/1","doc":"Gets a single dataclip.\n\nRaises `Ecto.NoResultsError` if the Dataclip does not exist.","ref":"Lightning.Invocation.html#get_dataclip!/1"},{"type":"function","title":"Examples - Lightning.Invocation.get_dataclip!/1","doc":"iex> get_dataclip!(123)\n %Dataclip{}\n\n iex> get_dataclip!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_dataclip!/1-examples"},{"type":"function","title":"Lightning.Invocation.get_dataclip_details!/1","doc":"","ref":"Lightning.Invocation.html#get_dataclip_details!/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip_for_run/1","doc":"","ref":"Lightning.Invocation.html#get_dataclip_for_run/1"},{"type":"function","title":"Lightning.Invocation.get_dataclip_query/1","doc":"Query for retrieving the dataclip that was step's starting dataclip.","ref":"Lightning.Invocation.html#get_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_first_dataclip_for_run_and_job/2","doc":"","ref":"Lightning.Invocation.html#get_first_dataclip_for_run_and_job/2"},{"type":"function","title":"Lightning.Invocation.get_first_step_for_run_and_job/2","doc":"","ref":"Lightning.Invocation.html#get_first_step_for_run_and_job/2"},{"type":"function","title":"Lightning.Invocation.get_output_dataclip_query/1","doc":"Query for retrieving the dataclip that was the result of a successful step.","ref":"Lightning.Invocation.html#get_output_dataclip_query/1"},{"type":"function","title":"Lightning.Invocation.get_step!/1","doc":"Gets a single step.\n\nRaises `Ecto.NoResultsError` if the Step does not exist.","ref":"Lightning.Invocation.html#get_step!/1"},{"type":"function","title":"Examples - Lightning.Invocation.get_step!/1","doc":"iex> get_step!(123)\n %Step{}\n\n iex> get_step!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Invocation.html#get_step!/1-examples"},{"type":"function","title":"Lightning.Invocation.get_step_count_for_run/1","doc":"","ref":"Lightning.Invocation.html#get_step_count_for_run/1"},{"type":"function","title":"Lightning.Invocation.get_step_with_job!/1","doc":"Fetches a step and preloads the job via the step's event.","ref":"Lightning.Invocation.html#get_step_with_job!/1"},{"type":"function","title":"Lightning.Invocation.get_workorders_by_ids/1","doc":"","ref":"Lightning.Invocation.html#get_workorders_by_ids/1"},{"type":"function","title":"Lightning.Invocation.get_workorders_count_limit/0","doc":"","ref":"Lightning.Invocation.html#get_workorders_count_limit/0"},{"type":"function","title":"Lightning.Invocation.list_dataclips/0","doc":"Returns the list of dataclips.","ref":"Lightning.Invocation.html#list_dataclips/0"},{"type":"function","title":"Examples - Lightning.Invocation.list_dataclips/0","doc":"iex> list_dataclips()\n [%Dataclip{}, ...]","ref":"Lightning.Invocation.html#list_dataclips/0-examples"},{"type":"function","title":"Lightning.Invocation.list_dataclips/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_for_job/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_for_job/1"},{"type":"function","title":"Lightning.Invocation.list_dataclips_query/1","doc":"","ref":"Lightning.Invocation.html#list_dataclips_query/1"},{"type":"function","title":"Lightning.Invocation.list_steps/0","doc":"Returns the list of steps.","ref":"Lightning.Invocation.html#list_steps/0"},{"type":"function","title":"Examples - Lightning.Invocation.list_steps/0","doc":"iex> list_steps()\n [%Step{}, ...]","ref":"Lightning.Invocation.html#list_steps/0-examples"},{"type":"function","title":"Lightning.Invocation.list_steps_for_project/2","doc":"","ref":"Lightning.Invocation.html#list_steps_for_project/2"},{"type":"function","title":"Lightning.Invocation.list_steps_for_project_query/1","doc":"","ref":"Lightning.Invocation.html#list_steps_for_project_query/1"},{"type":"function","title":"Lightning.Invocation.logs_for_step/1","doc":"Return all logs for a step as a list","ref":"Lightning.Invocation.html#logs_for_step/1"},{"type":"function","title":"Lightning.Invocation.search_workorders/1","doc":"Searches for work orders based on project and search parameters.","ref":"Lightning.Invocation.html#search_workorders/1"},{"type":"function","title":"Parameters: - Lightning.Invocation.search_workorders/1","doc":"- `project`: The project to filter the work orders by.\n- `search_params`: The parameters to guide the search.","ref":"Lightning.Invocation.html#search_workorders/1-parameters"},{"type":"function","title":"Returns: - Lightning.Invocation.search_workorders/1","doc":"A paginated list of work orders that match the criteria.","ref":"Lightning.Invocation.html#search_workorders/1-returns"},{"type":"function","title":"Example: - Lightning.Invocation.search_workorders/1","doc":"search_workorders(%Project{id: 1}, %SearchParams{status: [\"completed\"]})","ref":"Lightning.Invocation.html#search_workorders/1-example"},{"type":"function","title":"Lightning.Invocation.search_workorders/3","doc":"","ref":"Lightning.Invocation.html#search_workorders/3"},{"type":"function","title":"Lightning.Invocation.search_workorders_for_export_query/2","doc":"","ref":"Lightning.Invocation.html#search_workorders_for_export_query/2"},{"type":"function","title":"Lightning.Invocation.search_workorders_for_retry/2","doc":"","ref":"Lightning.Invocation.html#search_workorders_for_retry/2"},{"type":"function","title":"Lightning.Invocation.update_dataclip/2","doc":"Updates a dataclip.","ref":"Lightning.Invocation.html#update_dataclip/2"},{"type":"function","title":"Examples - Lightning.Invocation.update_dataclip/2","doc":"iex> update_dataclip(dataclip, %{field: new_value})\n {:ok, %Dataclip{}}\n\n iex> update_dataclip(dataclip, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Invocation.html#update_dataclip/2-examples"},{"type":"function","title":"Lightning.Invocation.with_runs/1","doc":"","ref":"Lightning.Invocation.html#with_runs/1"},{"type":"module","title":"Lightning.Invocation.Dataclip","doc":"Ecto model for Dataclips.\n\nDataclips represent some data that arrived in the system, and records both\nthe data and the source of the data.","ref":"Lightning.Invocation.Dataclip.html"},{"type":"module","title":"Types - Lightning.Invocation.Dataclip","doc":"* `:http_request`\n The data arrived via a webhook.\n* `:global`\n Was created manually, and is intended to be used multiple times.\n When repetitive static data is needed to be maintained, instead of hard-coding\n into a Job - a more convenient solution is to create a `:global` Dataclip\n and access it inside the Job.\n* `:step_result`\n The final state of a step.\n* `:saved_input`\n An arbitrary input, created by a user. (Only configuration will be overwritten.)","ref":"Lightning.Invocation.Dataclip.html#module-types"},{"type":"function","title":"Lightning.Invocation.Dataclip.new/1","doc":"","ref":"Lightning.Invocation.Dataclip.html#new/1"},{"type":"function","title":"Lightning.Invocation.Dataclip.source_types/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#source_types/0"},{"type":"function","title":"Lightning.Invocation.Dataclip.validate_by_type/1","doc":"Append validations based on the type of the Dataclip.\n\n- `:step_result` must have an associated Step model.","ref":"Lightning.Invocation.Dataclip.html#validate_by_type/1"},{"type":"type","title":"Lightning.Invocation.Dataclip.source_type/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:source_type/0"},{"type":"type","title":"Lightning.Invocation.Dataclip.t/0","doc":"","ref":"Lightning.Invocation.Dataclip.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.LogLine","doc":"Ecto model for run logs.\n\nEvery log line from a worker is stored using this model.\n\nCurrently the `:message` field is a text field, however the worker sends\nmessages in a JSON format. We will at some point consider changing this to\na JSON field; but for now we coerce it into a string.\n\nSee [`LogMessage`](`Lightning.LogMessage`) for more information.","ref":"Lightning.Invocation.LogLine.html"},{"type":"function","title":"Lightning.Invocation.LogLine.new/3","doc":"","ref":"Lightning.Invocation.LogLine.html#new/3"},{"type":"function","title":"Lightning.Invocation.LogLine.validate/2","doc":"","ref":"Lightning.Invocation.LogLine.html#validate/2"},{"type":"type","title":"Lightning.Invocation.LogLine.t/0","doc":"","ref":"Lightning.Invocation.LogLine.html#t:t/0"},{"type":"module","title":"Lightning.Invocation.Query","doc":"Query functions for working with Steps and Dataclips","ref":"Lightning.Invocation.Query.html"},{"type":"function","title":"Lightning.Invocation.Query.any_step/0","doc":"To be used in preloads for `workflow > job > step` when the presence of any\nstep is all the information we need. As in, \"Does this job have any steps?\"","ref":"Lightning.Invocation.Query.html#any_step/0"},{"type":"function","title":"Lightning.Invocation.Query.dataclip_with_body/0","doc":"By default, the dataclip body is not returned via a query. This query selects\nthe body specifically.","ref":"Lightning.Invocation.Query.html#dataclip_with_body/0"},{"type":"function","title":"Lightning.Invocation.Query.last_n_for_job/2","doc":"","ref":"Lightning.Invocation.Query.html#last_n_for_job/2"},{"type":"function","title":"Lightning.Invocation.Query.last_step_for_job/1","doc":"The last step for a job","ref":"Lightning.Invocation.Query.html#last_step_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.last_successful_step_for_job/1","doc":"The last successful step for a job, used in scheduler to enable downstream runs\nto access a previous run's state","ref":"Lightning.Invocation.Query.html#last_successful_step_for_job/1"},{"type":"function","title":"Lightning.Invocation.Query.select_as_input/1","doc":"Returns a dataclip formatted for use as an input state.\n\nOnly `http_request` dataclips are changed, their `body` is nested inside a\n`\"data\"` key and `request` data is added as a `\"request\"` key.","ref":"Lightning.Invocation.Query.html#select_as_input/1"},{"type":"function","title":"Lightning.Invocation.Query.steps_for/1","doc":"Steps for a specific user","ref":"Lightning.Invocation.Query.html#steps_for/1"},{"type":"function","title":"Lightning.Invocation.Query.steps_with_reason/2","doc":"The last step for a job for a particular exit reason, used in scheduler","ref":"Lightning.Invocation.Query.html#steps_with_reason/2"},{"type":"function","title":"Lightning.Invocation.Query.wipe_dataclips/1","doc":"","ref":"Lightning.Invocation.Query.html#wipe_dataclips/1"},{"type":"module","title":"Lightning.Invocation.Step","doc":"Ecto model for Steps.\n\nA step is part of a run and represents the work initiated for a single\nJob with a single `input_dataclip`.\n\nOnce completed (successfully) it will have an `output_dataclip` associated\nwith it as well.\n\nWhen a step finishes, it's `:exit_reason` is set to one of following strings:\n\n- `\"success\"`\n- `\"fail\"`\n- `\"crash\"`\n- `\"cancel\"`\n- `\"kill\"`\n- `\"exception\"`\n- `\"lost\"`","ref":"Lightning.Invocation.Step.html"},{"type":"function","title":"Lightning.Invocation.Step.finished/2","doc":"","ref":"Lightning.Invocation.Step.html#finished/2"},{"type":"function","title":"Lightning.Invocation.Step.new/1","doc":"","ref":"Lightning.Invocation.Step.html#new/1"},{"type":"function","title":"Lightning.Invocation.Step.validate/1","doc":"","ref":"Lightning.Invocation.Step.html#validate/1"},{"type":"type","title":"Lightning.Invocation.Step.t/0","doc":"","ref":"Lightning.Invocation.Step.html#t:t/0"},{"type":"module","title":"Lightning.Jobs","doc":"The Jobs context.","ref":"Lightning.Jobs.html"},{"type":"function","title":"Lightning.Jobs.change_job/2","doc":"Returns an `%Ecto.Changeset{}` for tracking job changes.","ref":"Lightning.Jobs.html#change_job/2"},{"type":"function","title":"Examples - Lightning.Jobs.change_job/2","doc":"iex> change_job(job)\n %Ecto.Changeset{data: %Job{}}","ref":"Lightning.Jobs.html#change_job/2-examples"},{"type":"function","title":"Lightning.Jobs.create_job/1","doc":"Creates a job.","ref":"Lightning.Jobs.html#create_job/1"},{"type":"function","title":"Examples - Lightning.Jobs.create_job/1","doc":"iex> create_job(%{field: value})\n {:ok, %Job{}}\n\n iex> create_job(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Jobs.html#create_job/1-examples"},{"type":"function","title":"Lightning.Jobs.get_downstream_jobs_for/2","doc":"Returns the list of downstream jobs for a given job, optionally matching a\nspecific trigger type.\nWhen downstream_jobs_for is called without a trigger that means its between jobs\nwhen it called with a trigger that means we are starting from outside the pipeline","ref":"Lightning.Jobs.html#get_downstream_jobs_for/2"},{"type":"function","title":"Lightning.Jobs.get_job!/1","doc":"Gets a single job.\n\nRaises `Ecto.NoResultsError` if the Job does not exist.","ref":"Lightning.Jobs.html#get_job!/1"},{"type":"function","title":"Examples - Lightning.Jobs.get_job!/1","doc":"iex> get_job!(123)\n %Job{}\n\n iex> get_job!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Jobs.html#get_job!/1-examples"},{"type":"function","title":"Lightning.Jobs.get_job_with_credential/1","doc":"","ref":"Lightning.Jobs.html#get_job_with_credential/1"},{"type":"function","title":"Lightning.Jobs.get_upstream_jobs_for/1","doc":"Returns the list of jobs excluding the one given.","ref":"Lightning.Jobs.html#get_upstream_jobs_for/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project/1"},{"type":"function","title":"Lightning.Jobs.jobs_for_project_query/1","doc":"","ref":"Lightning.Jobs.html#jobs_for_project_query/1"},{"type":"function","title":"Lightning.Jobs.list_active_cron_jobs/0","doc":"","ref":"Lightning.Jobs.html#list_active_cron_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs/0","doc":"Returns the list of jobs.","ref":"Lightning.Jobs.html#list_jobs/0"},{"type":"function","title":"Lightning.Jobs.list_jobs_for_workflow/1","doc":"","ref":"Lightning.Jobs.html#list_jobs_for_workflow/1"},{"type":"function","title":"Lightning.Jobs.update_job/2","doc":"Updates a job.","ref":"Lightning.Jobs.html#update_job/2"},{"type":"function","title":"Examples - Lightning.Jobs.update_job/2","doc":"iex> update_job(job, %{field: new_value})\n {:ok, %Job{}}\n\n iex> update_job(job, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Jobs.html#update_job/2-examples"},{"type":"module","title":"Lightning.Projects","doc":"The Projects context.","ref":"Lightning.Projects.html"},{"type":"function","title":"Lightning.Projects.add_project_users/3","doc":"","ref":"Lightning.Projects.html#add_project_users/3"},{"type":"function","title":"Lightning.Projects.cancel_scheduled_deletion/1","doc":"","ref":"Lightning.Projects.html#cancel_scheduled_deletion/1"},{"type":"function","title":"Lightning.Projects.change_project/2","doc":"Returns an `%Ecto.Changeset{}` for tracking project changes.","ref":"Lightning.Projects.html#change_project/2"},{"type":"function","title":"Examples - Lightning.Projects.change_project/2","doc":"iex> change_project(project)\n %Ecto.Changeset{data: %Project{}}","ref":"Lightning.Projects.html#change_project/2-examples"},{"type":"function","title":"Lightning.Projects.create_project/2","doc":"Creates a project.","ref":"Lightning.Projects.html#create_project/2"},{"type":"function","title":"Examples - Lightning.Projects.create_project/2","doc":"iex> create_project(%{field: value})\n {:ok, %Project{}}\n\n iex> create_project(%{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#create_project/2-examples"},{"type":"function","title":"Lightning.Projects.delete_project/1","doc":"Deletes a project and its related data, including workflows, work orders,\nsteps, jobs, runs, triggers, project users, project credentials, and dataclips","ref":"Lightning.Projects.html#delete_project/1"},{"type":"function","title":"Examples - Lightning.Projects.delete_project/1","doc":"iex> delete_project(project)\n {:ok, %Project{}}\n\n iex> delete_project(project)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#delete_project/1-examples"},{"type":"function","title":"Lightning.Projects.delete_project_user!/1","doc":"","ref":"Lightning.Projects.html#delete_project_user!/1"},{"type":"function","title":"Lightning.Projects.export_project/3","doc":"Exports a project as yaml.","ref":"Lightning.Projects.html#export_project/3"},{"type":"function","title":"Examples - Lightning.Projects.export_project/3","doc":"iex> export_project(:yaml, project_id)\n {:ok, string}","ref":"Lightning.Projects.html#export_project/3-examples"},{"type":"function","title":"Lightning.Projects.get_project/1","doc":"","ref":"Lightning.Projects.html#get_project/1"},{"type":"function","title":"Lightning.Projects.get_project!/1","doc":"Gets a single project.\n\nRaises `Ecto.NoResultsError` if the Project does not exist.","ref":"Lightning.Projects.html#get_project!/1"},{"type":"function","title":"Examples - Lightning.Projects.get_project!/1","doc":"iex> get_project!(123)\n %Project{}\n\n iex> get_project!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project!/1-examples"},{"type":"function","title":"Lightning.Projects.get_project_credential/2","doc":"","ref":"Lightning.Projects.html#get_project_credential/2"},{"type":"function","title":"Lightning.Projects.get_project_user/1","doc":"","ref":"Lightning.Projects.html#get_project_user/1"},{"type":"function","title":"Lightning.Projects.get_project_user/2","doc":"","ref":"Lightning.Projects.html#get_project_user/2"},{"type":"function","title":"Lightning.Projects.get_project_user!/1","doc":"Gets a single project_user.\n\nRaises `Ecto.NoResultsError` if the ProjectUser does not exist.","ref":"Lightning.Projects.html#get_project_user!/1"},{"type":"function","title":"Examples - Lightning.Projects.get_project_user!/1","doc":"iex> get_project_user!(123)\n %ProjectUser{}\n\n iex> get_project_user!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_user!/1-examples"},{"type":"function","title":"Lightning.Projects.get_project_user_role/2","doc":"Returns the role of a user in a project.\nPossible roles are :admin, :viewer, :editor, and :owner","ref":"Lightning.Projects.html#get_project_user_role/2"},{"type":"function","title":"Examples - Lightning.Projects.get_project_user_role/2","doc":"iex> get_project_user_role(user, project)\n :admin\n\n iex> get_project_user_role(user, project)\n :viewer\n\n iex> get_project_user_role(user, project)\n :editor\n\n iex> get_project_user_role(user, project)\n :owner","ref":"Lightning.Projects.html#get_project_user_role/2-examples"},{"type":"function","title":"Lightning.Projects.get_project_users!/1","doc":"Get all project users for a given project","ref":"Lightning.Projects.html#get_project_users!/1"},{"type":"function","title":"Lightning.Projects.get_project_with_users!/1","doc":"Gets a single project with it's members via `project_users`.\n\nRaises `Ecto.NoResultsError` if the Project does not exist.","ref":"Lightning.Projects.html#get_project_with_users!/1"},{"type":"function","title":"Examples - Lightning.Projects.get_project_with_users!/1","doc":"iex> get_project!(123)\n %Project{}\n\n iex> get_project!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Projects.html#get_project_with_users!/1-examples"},{"type":"function","title":"Lightning.Projects.get_projects_for_user/2","doc":"Fetches projects for a given user from the database.","ref":"Lightning.Projects.html#get_projects_for_user/2"},{"type":"function","title":"Parameters - Lightning.Projects.get_projects_for_user/2","doc":"- user: The user struct for which projects are being queried.\n- opts: Keyword list of options including :include for associations to preload and :order_by for sorting.","ref":"Lightning.Projects.html#get_projects_for_user/2-parameters"},{"type":"function","title":"Returns - Lightning.Projects.get_projects_for_user/2","doc":"- A list of projects associated with the user.","ref":"Lightning.Projects.html#get_projects_for_user/2-returns"},{"type":"function","title":"Lightning.Projects.invite_collaborators/3","doc":"","ref":"Lightning.Projects.html#invite_collaborators/3"},{"type":"function","title":"Lightning.Projects.list_project_admin_emails/1","doc":"Lists emails of users with `:owner` or `:admin` roles in the project","ref":"Lightning.Projects.html#list_project_admin_emails/1"},{"type":"function","title":"Lightning.Projects.list_project_credentials/1","doc":"","ref":"Lightning.Projects.html#list_project_credentials/1"},{"type":"function","title":"Lightning.Projects.list_project_files/2","doc":"","ref":"Lightning.Projects.html#list_project_files/2"},{"type":"function","title":"Lightning.Projects.list_projects/0","doc":"Returns the list of projects.","ref":"Lightning.Projects.html#list_projects/0"},{"type":"function","title":"Examples - Lightning.Projects.list_projects/0","doc":"iex> list_projects()\n [%Project{}, ...]","ref":"Lightning.Projects.html#list_projects/0-examples"},{"type":"function","title":"Lightning.Projects.list_projects_having_history_retention/0","doc":"Lists all projects that have history retention","ref":"Lightning.Projects.html#list_projects_having_history_retention/0"},{"type":"function","title":"Lightning.Projects.member_of?/2","doc":"","ref":"Lightning.Projects.html#member_of?/2"},{"type":"function","title":"Lightning.Projects.perform/1","doc":"Perform, when called with %{\"type\" => \"purge_deleted\"}\nwill find projects that are ready for permanent deletion and purge them.","ref":"Lightning.Projects.html#perform/1"},{"type":"function","title":"Lightning.Projects.project_credentials_query/1","doc":"","ref":"Lightning.Projects.html#project_credentials_query/1"},{"type":"function","title":"Lightning.Projects.project_dataclips_query/1","doc":"","ref":"Lightning.Projects.html#project_dataclips_query/1"},{"type":"function","title":"Lightning.Projects.project_jobs_query/1","doc":"","ref":"Lightning.Projects.html#project_jobs_query/1"},{"type":"function","title":"Lightning.Projects.project_run_step_query/1","doc":"","ref":"Lightning.Projects.html#project_run_step_query/1"},{"type":"function","title":"Lightning.Projects.project_runs_query/1","doc":"","ref":"Lightning.Projects.html#project_runs_query/1"},{"type":"function","title":"Lightning.Projects.project_steps_query/1","doc":"","ref":"Lightning.Projects.html#project_steps_query/1"},{"type":"function","title":"Lightning.Projects.project_triggers_query/1","doc":"","ref":"Lightning.Projects.html#project_triggers_query/1"},{"type":"function","title":"Lightning.Projects.project_user_role_query/2","doc":"","ref":"Lightning.Projects.html#project_user_role_query/2"},{"type":"function","title":"Lightning.Projects.project_users_query/1","doc":"","ref":"Lightning.Projects.html#project_users_query/1"},{"type":"function","title":"Lightning.Projects.project_workflows_query/1","doc":"","ref":"Lightning.Projects.html#project_workflows_query/1"},{"type":"function","title":"Lightning.Projects.project_workorders_query/1","doc":"","ref":"Lightning.Projects.html#project_workorders_query/1"},{"type":"function","title":"Lightning.Projects.projects_for_user_query/2","doc":"Builds a query to retrieve projects associated with a user.","ref":"Lightning.Projects.html#projects_for_user_query/2"},{"type":"function","title":"Parameters - Lightning.Projects.projects_for_user_query/2","doc":"- user: The user struct for which projects are being queried.\n - opts: Keyword list of options including :include for associations to preload and :order_by for sorting.","ref":"Lightning.Projects.html#projects_for_user_query/2-parameters"},{"type":"function","title":"Returns - Lightning.Projects.projects_for_user_query/2","doc":"- An Ecto queryable struct to fetch projects.","ref":"Lightning.Projects.html#projects_for_user_query/2-returns"},{"type":"function","title":"Lightning.Projects.save_dataclips?/1","doc":"Should input or output dataclips be saved for runs in this project?","ref":"Lightning.Projects.html#save_dataclips?/1"},{"type":"function","title":"Lightning.Projects.schedule_project_deletion/1","doc":"Given a project, this function sets a scheduled deletion\ndate based on the PURGE_DELETED_AFTER_DAYS environment variable. If no ENV is\nset, this date defaults to NOW but the automatic project purge cronjob will\nnever run. (Note that subsequent logins will be blocked for projects pending\ndeletion.)","ref":"Lightning.Projects.html#schedule_project_deletion/1"},{"type":"function","title":"Lightning.Projects.select_first_project_for_user/1","doc":"","ref":"Lightning.Projects.html#select_first_project_for_user/1"},{"type":"function","title":"Lightning.Projects.update_project/2","doc":"Updates a project.","ref":"Lightning.Projects.html#update_project/2"},{"type":"function","title":"Examples - Lightning.Projects.update_project/2","doc":"iex> update_project(project, %{field: new_value})\n {:ok, %Project{}}\n\n iex> update_project(project, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#update_project/2-examples"},{"type":"function","title":"Lightning.Projects.update_project_user/2","doc":"Updates a project user.","ref":"Lightning.Projects.html#update_project_user/2"},{"type":"function","title":"Examples - Lightning.Projects.update_project_user/2","doc":"iex> update_project_user(project_user, %{field: new_value})\n {:ok, %ProjectUser{}}\n\n iex> update_project_user(projectUser, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.Projects.html#update_project_user/2-examples"},{"type":"function","title":"Lightning.Projects.update_project_with_users/3","doc":"","ref":"Lightning.Projects.html#update_project_with_users/3"},{"type":"function","title":"Lightning.Projects.url_safe_project_name/1","doc":"","ref":"Lightning.Projects.html#url_safe_project_name/1"},{"type":"function","title":"Lightning.Projects.validate_for_deletion/2","doc":"Returns an `%Ecto.Changeset{}` for changing the project scheduled_deletion.","ref":"Lightning.Projects.html#validate_for_deletion/2"},{"type":"function","title":"Examples - Lightning.Projects.validate_for_deletion/2","doc":"iex> validate_for_deletion(project)\n %Ecto.Changeset{data: %Project{}}","ref":"Lightning.Projects.html#validate_for_deletion/2-examples"},{"type":"module","title":"Lightning.Projects.Events","doc":"Events for Projects changes.","ref":"Lightning.Projects.Events.html"},{"type":"function","title":"Lightning.Projects.Events.project_created/1","doc":"","ref":"Lightning.Projects.Events.html#project_created/1"},{"type":"function","title":"Lightning.Projects.Events.project_deleted/1","doc":"","ref":"Lightning.Projects.Events.html#project_deleted/1"},{"type":"function","title":"Lightning.Projects.Events.subscribe/0","doc":"","ref":"Lightning.Projects.Events.html#subscribe/0"},{"type":"module","title":"Lightning.Projects.File","doc":"The project files module","ref":"Lightning.Projects.File.html"},{"type":"function","title":"Lightning.Projects.File.mark_failed/1","doc":"","ref":"Lightning.Projects.File.html#mark_failed/1"},{"type":"function","title":"Lightning.Projects.File.new/1","doc":"Creates a new file changeset.\n\nUnlike regular changeset functions, this expects atom keys and the project\nand user to be passed in as models.","ref":"Lightning.Projects.File.html#new/1"},{"type":"type","title":"Lightning.Projects.File.t/0","doc":"","ref":"Lightning.Projects.File.html#t:t/0"},{"type":"module","title":"Lightning.Projects.Project","doc":"Project model","ref":"Lightning.Projects.Project.html"},{"type":"function","title":"Lightning.Projects.Project.deletion_changeset/2","doc":"Changeset to validate a project deletion request, the user must enter the\nprojects name to confirm.","ref":"Lightning.Projects.Project.html#deletion_changeset/2"},{"type":"function","title":"Lightning.Projects.Project.project_with_users_changeset/2","doc":"","ref":"Lightning.Projects.Project.html#project_with_users_changeset/2"},{"type":"function","title":"Lightning.Projects.Project.validate/1","doc":"","ref":"Lightning.Projects.Project.html#validate/1"},{"type":"type","title":"Lightning.Projects.Project.retention_policy_type/0","doc":"","ref":"Lightning.Projects.Project.html#t:retention_policy_type/0"},{"type":"type","title":"Lightning.Projects.Project.t/0","doc":"","ref":"Lightning.Projects.Project.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectCredential","doc":"Join table to assign credentials to a project","ref":"Lightning.Projects.ProjectCredential.html"},{"type":"type","title":"Lightning.Projects.ProjectCredential.t/0","doc":"","ref":"Lightning.Projects.ProjectCredential.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectOauthClient","doc":"Manages the relationship between OAuth clients and projects, acting as a join table.\nThis module defines the schema and validations needed for creating and managing\nassociations between `OauthClient` and `Project`. It ensures that an OAuth client\ncan be associated with a project, facilitating the management of access permissions\nand settings specific to a project.","ref":"Lightning.Projects.ProjectOauthClient.html"},{"type":"module","title":"Schema Information - Lightning.Projects.ProjectOauthClient","doc":"The schema represents the bridge between projects and OAuth clients with the following fields:\n\n- `:id`: The unique identifier for the association, automatically generated.\n- `:oauth_client_id`: Foreign key to link with the OAuth client.\n- `:project_id`: Foreign key to link with the project.\n\nThis module also includes a virtual field `:delete` to mark an association for deletion,\naiding in operations that require soft deletion patterns or special handling before\nactually removing an association.","ref":"Lightning.Projects.ProjectOauthClient.html#module-schema-information"},{"type":"module","title":"Usage - Lightning.Projects.ProjectOauthClient","doc":"The primary function of this module is to create and manage changesets for adding or\nremoving OAuth clients from projects, ensuring data integrity and enforcing business\nrules such as uniqueness of the association.","ref":"Lightning.Projects.ProjectOauthClient.html#module-usage"},{"type":"function","title":"Lightning.Projects.ProjectOauthClient.changeset/2","doc":"Creates or updates changesets for a `ProjectOauthClient` entity based on the given attributes.\nValidates required fields and applies a unique constraint to ensure an OAuth client\ncan be associated with a project only once.\n\nThis changeset is used for adding new or updating existing associations between an OAuth client and a project.","ref":"Lightning.Projects.ProjectOauthClient.html#changeset/2"},{"type":"type","title":"Lightning.Projects.ProjectOauthClient.t/0","doc":"","ref":"Lightning.Projects.ProjectOauthClient.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser","doc":"Join table to assign users to a project","ref":"Lightning.Projects.ProjectUser.html"},{"type":"type","title":"Lightning.Projects.ProjectUser.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.DigestEnum","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.cast/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.dump/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.embed_as/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.equal?/2","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.load/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.type/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.DigestEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.DigestEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.DigestEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.ProjectUser.RolesEnum","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.cast/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#cast/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.create_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#create_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.drop_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#drop_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.dump/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#dump/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.embed_as/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#embed_as/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.equal?/2","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#equal?/2"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.load/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#load/1"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schema/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schema/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.schemaless_type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#schemaless_type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.type/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#type/0"},{"type":"function","title":"Lightning.Projects.ProjectUser.RolesEnum.valid_value?/1","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#valid_value?/1"},{"type":"type","title":"Lightning.Projects.ProjectUser.RolesEnum.t/0","doc":"","ref":"Lightning.Projects.ProjectUser.RolesEnum.html#t:t/0"},{"type":"module","title":"Lightning.Projects.Provisioner","doc":"Provides functions for importing projects. This module is used by the\nprovisioning HTTP API.\n\nWhen providing a project to import, all records must have an `id` field.\nIt's up to the caller to ensure that the `id` is unique and generated\nahead of time in the case of new records.","ref":"Lightning.Projects.Provisioner.html"},{"type":"function","title":"Lightning.Projects.Provisioner.import_document/3","doc":"Import a project.","ref":"Lightning.Projects.Provisioner.html#import_document/3"},{"type":"function","title":"Lightning.Projects.Provisioner.parse_document/2","doc":"","ref":"Lightning.Projects.Provisioner.html#parse_document/2"},{"type":"function","title":"Lightning.Projects.Provisioner.preload_dependencies/2","doc":"Preload all dependencies for a project.\n\nExclude deleted workflows.","ref":"Lightning.Projects.Provisioner.html#preload_dependencies/2"},{"type":"function","title":"Lightning.Projects.Provisioner.validate_extraneous_params/1","doc":"Validate that there are no extraneous parameters in the changeset.\n\nFor all params in the changeset, ensure that the param is in the list of\nknown fields in the schema.","ref":"Lightning.Projects.Provisioner.html#validate_extraneous_params/1"},{"type":"module","title":"Lightning.Runtime.LogAgent","doc":"Agent facility to consume STDOUT/STDERR byte by byte.\n\nSince it works on a byte by byte basis, you will need to perform line-splitting\nyourself.\n\nUsage:\n\n```\n{:ok, log} = LogAgent.start_link()\n\"foo\" = LogAgent.process_chunk(log, {:stdout, \"foo\"})\n\"foobar\" = LogAgent.process_chunk(log, {:stdout, \"bar\"})\n```","ref":"Lightning.Runtime.LogAgent.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Runtime.LogAgent.html#child_spec/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.start_link/1","doc":"","ref":"Lightning.Runtime.LogAgent.html#start_link/1"},{"type":"type","title":"Lightning.Runtime.LogAgent.logline/0","doc":"","ref":"Lightning.Runtime.LogAgent.html#t:logline/0"},{"type":"module","title":"Lightning.Runtime.LogAgent.StringBuffer","doc":"Internal datastructure to hold and process new bytes for a list of\ncharacters.\n\nBy checking the if the buffer is a complete grapheme, emitting the buffer\nonce valid and returning `nil` otherwise.\n\nIn the case of emojis and other language character sets, a character\n(in UTF-8) can be between 1-4 bytes - when streaming logs for example\nit's quite easy to receive less than the whole character which can\nresult in crashes or corrupt text.","ref":"Lightning.Runtime.LogAgent.StringBuffer.html"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.buffer/1","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#buffer/1"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.new/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#new/0"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.process_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#process_chunk/2"},{"type":"function","title":"Lightning.Runtime.LogAgent.StringBuffer.reduce_chunk/2","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#reduce_chunk/2"},{"type":"type","title":"Lightning.Runtime.LogAgent.StringBuffer.t/0","doc":"","ref":"Lightning.Runtime.LogAgent.StringBuffer.html#t:t/0"},{"type":"module","title":"Lightning.Runtime.RuntimeManager","doc":"Locates and runs the Runtime server. Added in order to ease development and default installations of Lightning\n\n# https://registry.npmjs.org/lightning-runtime/latest","ref":"Lightning.Runtime.RuntimeManager.html"},{"type":"module","title":"Runtime configuration - Lightning.Runtime.RuntimeManager","doc":"Sample:\n\n config :lightining, Elixir.Lightning.Runtime.RuntimeManager,\n version: \"0.1.0\",\n start: true,\n args: ~w(js/app.js --bundle --target=es2016 --outdir=../priv/static/assets),\n cd: Path.expand(\"../assets\", __DIR__),\n env: %{}\n\nOptions:\n\n * `:version` - the expected runtime version\n\n * `:start` - flag to start the runtime manager. If `false` the GenServer\n won't be started\n\n * `:path` - the path to find the runtime executable at. By\n default, it is automatically downloaded and placed inside\n the `_build` directory of your current app\n\nOverriding the `:path` is not recommended, as we will automatically\ndownload and manage the `runtime` for you.","ref":"Lightning.Runtime.RuntimeManager.html#module-runtime-configuration"},{"type":"function","title":"Lightning.Runtime.RuntimeManager.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Runtime.RuntimeManager.html#child_spec/1"},{"type":"function","title":"Lightning.Runtime.RuntimeManager.start_link/1","doc":"","ref":"Lightning.Runtime.RuntimeManager.html#start_link/1"},{"type":"behaviour","title":"Lightning.Runtime.RuntimeManager.RuntimeClient","doc":"Behaviour for runtime clients to improve testability.","ref":"Lightning.Runtime.RuntimeManager.RuntimeClient.html"},{"type":"callback","title":"Lightning.Runtime.RuntimeManager.RuntimeClient.start_runtime/1","doc":"","ref":"Lightning.Runtime.RuntimeManager.RuntimeClient.html#c:start_runtime/1"},{"type":"callback","title":"Lightning.Runtime.RuntimeManager.RuntimeClient.stop_runtime/1","doc":"","ref":"Lightning.Runtime.RuntimeManager.RuntimeClient.html#c:stop_runtime/1"},{"type":"module","title":"Lightning.Workflows","doc":"The Workflows context.","ref":"Lightning.Workflows.html"},{"type":"function","title":"Lightning.Workflows.build_trigger/1","doc":"Builds a Trigger","ref":"Lightning.Workflows.html#build_trigger/1"},{"type":"function","title":"Lightning.Workflows.capture_snapshot/1","doc":"Creates a snapshot from a multi.\n\nWhen the multi already has a `:workflow` change, it is assumed to be changed\nor inserted and will attempt to build and insert a new snapshot.\n\nWhen there isn't a `:workflow` change, it tries to find a dependant model\nlike a Job, Trigger or Edge and uses the workflow associated with that\nmodel.\n\nIn this case we assume that the workflow wasn't actually updated,\n`Workflow.touch()` is called to bump the `updated_at` and the `lock_version`\nof the workflow before a snapshot is captured.","ref":"Lightning.Workflows.html#capture_snapshot/1"},{"type":"function","title":"Lightning.Workflows.change_workflow/2","doc":"Returns an `%Ecto.Changeset{}` for tracking workflow changes.","ref":"Lightning.Workflows.html#change_workflow/2"},{"type":"function","title":"Examples - Lightning.Workflows.change_workflow/2","doc":"iex> change_workflow(workflow)\n %Ecto.Changeset{data: %Workflow{}}","ref":"Lightning.Workflows.html#change_workflow/2-examples"},{"type":"function","title":"Lightning.Workflows.create_edge/1","doc":"Creates an edge","ref":"Lightning.Workflows.html#create_edge/1"},{"type":"function","title":"Lightning.Workflows.get_edge_by_trigger/1","doc":"Gets an `Edge` by its associated `Trigger`.","ref":"Lightning.Workflows.html#get_edge_by_trigger/1"},{"type":"function","title":"Parameters - Lightning.Workflows.get_edge_by_trigger/1","doc":"- `%Trigger{id: trigger_id}`: A `Trigger` struct from which the associated `Edge` is to be found.","ref":"Lightning.Workflows.html#get_edge_by_trigger/1-parameters"},{"type":"function","title":"Returns - Lightning.Workflows.get_edge_by_trigger/1","doc":"- Returns an `Edge` struct preloaded with its `source_trigger` and `target_job` if found.\n- Returns `nil` if no `Edge` is associated with the given `Trigger`.","ref":"Lightning.Workflows.html#get_edge_by_trigger/1-returns"},{"type":"function","title":"Examples - Lightning.Workflows.get_edge_by_trigger/1","doc":"```\ntrigger = %Trigger{id: 1, ...}\nLightning.Workflows.get_edge_by_trigger(trigger)\n# => %Edge{source_trigger: %Trigger{}, target_job: %Job{}, ...}\n\nnon_existent_trigger = %Trigger{id: 999, ...}\nLightning.Workflows.get_edge_by_trigger(non_existent_trigger)\n# => nil\n```","ref":"Lightning.Workflows.html#get_edge_by_trigger/1-examples"},{"type":"function","title":"Lightning.Workflows.get_edges_for_cron_execution/1","doc":"Returns a list of edges with jobs to execute, given a current timestamp in Unix. This is\nused by the scheduler, which calls this function once every minute.","ref":"Lightning.Workflows.html#get_edges_for_cron_execution/1"},{"type":"function","title":"Lightning.Workflows.get_trigger_by_webhook/1","doc":"Gets a single `Trigger` by its `custom_path` or `id`.","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1"},{"type":"function","title":"Parameters - Lightning.Workflows.get_trigger_by_webhook/1","doc":"- `path`: A binary string representing the `custom_path` or `id` of the trigger.","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1-parameters"},{"type":"function","title":"Returns - Lightning.Workflows.get_trigger_by_webhook/1","doc":"- Returns a `Trigger` struct if a trigger is found.\n- Returns `nil` if no trigger is found for the given `path`.","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1-returns"},{"type":"function","title":"Examples - Lightning.Workflows.get_trigger_by_webhook/1","doc":"```\nLightning.Workflows.get_trigger_by_webhook(\"some_path_or_id\")\n# => %Trigger{id: 1, custom_path: \"some_path_or_id\", ...}\n\nLightning.Workflows.get_trigger_by_webhook(\"non_existent_path_or_id\")\n# => nil\n```","ref":"Lightning.Workflows.html#get_trigger_by_webhook/1-examples"},{"type":"function","title":"Lightning.Workflows.get_webhook_trigger/2","doc":"Gets a Single Edge by it's webhook trigger.","ref":"Lightning.Workflows.html#get_webhook_trigger/2"},{"type":"function","title":"Lightning.Workflows.get_workflow/1","doc":"","ref":"Lightning.Workflows.html#get_workflow/1"},{"type":"function","title":"Lightning.Workflows.get_workflow!/1","doc":"Gets a single workflow.\n\nRaises `Ecto.NoResultsError` if the Workflow does not exist.","ref":"Lightning.Workflows.html#get_workflow!/1"},{"type":"function","title":"Examples - Lightning.Workflows.get_workflow!/1","doc":"iex> get_workflow!(123)\n %Workflow{}\n\n iex> get_workflow!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.Workflows.html#get_workflow!/1-examples"},{"type":"function","title":"Lightning.Workflows.get_workflows_for/1","doc":"Retrieves a list of active Workflows with their jobs and triggers preloaded.","ref":"Lightning.Workflows.html#get_workflows_for/1"},{"type":"function","title":"Lightning.Workflows.has_newer_version?/1","doc":"","ref":"Lightning.Workflows.html#has_newer_version?/1"},{"type":"function","title":"Lightning.Workflows.jobs_ordered_subquery/0","doc":"A way to ensure the consistency of nodes.\nThis query orders jobs based on their `inserted_at` timestamps in ascending order","ref":"Lightning.Workflows.html#jobs_ordered_subquery/0"},{"type":"function","title":"Lightning.Workflows.list_workflows/0","doc":"Returns the list of workflows.","ref":"Lightning.Workflows.html#list_workflows/0"},{"type":"function","title":"Examples - Lightning.Workflows.list_workflows/0","doc":"iex> list_workflows()\n [%Workflow{}, ...]","ref":"Lightning.Workflows.html#list_workflows/0-examples"},{"type":"function","title":"Lightning.Workflows.mark_for_deletion/2","doc":"Returns an `%Ecto.Changeset{}` for changing the workflow request_deletion.","ref":"Lightning.Workflows.html#mark_for_deletion/2"},{"type":"function","title":"Examples - Lightning.Workflows.mark_for_deletion/2","doc":"iex> change_request_deletion(workflow)\n %Ecto.Changeset{data: %Workflow{}}","ref":"Lightning.Workflows.html#mark_for_deletion/2-examples"},{"type":"function","title":"Lightning.Workflows.publish_kafka_trigger_events/1","doc":"","ref":"Lightning.Workflows.html#publish_kafka_trigger_events/1"},{"type":"function","title":"Lightning.Workflows.save_workflow/1","doc":"","ref":"Lightning.Workflows.html#save_workflow/1"},{"type":"function","title":"Lightning.Workflows.subscribe/1","doc":"","ref":"Lightning.Workflows.html#subscribe/1"},{"type":"function","title":"Lightning.Workflows.to_project_space/1","doc":"","ref":"Lightning.Workflows.html#to_project_space/1"},{"type":"function","title":"Lightning.Workflows.update_trigger/2","doc":"Updates a trigger","ref":"Lightning.Workflows.html#update_trigger/2"},{"type":"function","title":"Lightning.Workflows.workflow_exists?/2","doc":"Check if workflow exist","ref":"Lightning.Workflows.html#workflow_exists?/2"},{"type":"module","title":"Lightning.Workflows.Edge","doc":"Ecto model for Workflow Edges.\n\nA Workflow Edge represents a connection between two jobs\n(or a trigger and a job) in a workflow.\n\nThe source of the edge is either a job or a trigger.\nThe target of the edge is always a job.","ref":"Lightning.Workflows.Edge.html"},{"type":"function","title":"Lightning.Workflows.Edge.changeset/2","doc":"","ref":"Lightning.Workflows.Edge.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.Edge.new/1","doc":"","ref":"Lightning.Workflows.Edge.html#new/1"},{"type":"function","title":"Lightning.Workflows.Edge.validate/1","doc":"","ref":"Lightning.Workflows.Edge.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Edge.edge_condition/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:edge_condition/0"},{"type":"type","title":"Lightning.Workflows.Edge.t/0","doc":"","ref":"Lightning.Workflows.Edge.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Job","doc":"Ecto model for Jobs.\n\nA Job contains the fields for defining a job.\n\n* `body`\n The expression/javascript code\n* `name`\n A plain text identifier\n* `adaptor`\n An NPM style string that contains both the module name and it's version.\n E.g. `@openfn/language-http@v1.2.3` or `@openfn/language-foo@latest`.\n While the version suffix isn't enforced here as it's not strictly necessary\n in this context, the front end will ensure a version is stated (`@latest`\n being the default).","ref":"Lightning.Workflows.Job.html"},{"type":"function","title":"Lightning.Workflows.Job.new/1","doc":"","ref":"Lightning.Workflows.Job.html#new/1"},{"type":"function","title":"Lightning.Workflows.Job.put_project_credential/2","doc":"","ref":"Lightning.Workflows.Job.html#put_project_credential/2"},{"type":"function","title":"Lightning.Workflows.Job.put_workflow/2","doc":"Attaches a workflow to a job, this is useful when you have an unpersisted\nWorkflow changeset - and want it to be created at the same time as a Job.\n\n\nExample:\n\n workflow =\n Ecto.Changeset.cast(\n %Lightning.Workflows.Workflow{},\n %{ \"project_id\" => attrs[:project_id], \"id\" => Ecto.UUID.generate() },\n [:project_id, :id]\n )\n\n job =\n %Job{}\n |> Ecto.Changeset.change()\n |> Job.put_workflow(workflow)\n |> Job.changeset(attrs)","ref":"Lightning.Workflows.Job.html#put_workflow/2"},{"type":"function","title":"Lightning.Workflows.Job.validate/1","doc":"","ref":"Lightning.Workflows.Job.html#validate/1"},{"type":"type","title":"Lightning.Workflows.Job.t/0","doc":"","ref":"Lightning.Workflows.Job.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Node","doc":"Represents a node in a workflow graph.","ref":"Lightning.Workflows.Node.html"},{"type":"module","title":"Lightning.Workflows.Presence","doc":"Handles user presence tracking within the Workflow canvas page.\n\nThis module leverages Phoenix.Presence to track user sessions, manage user priorities,\nand list active presences on specified topics.","ref":"Lightning.Workflows.Presence.html"},{"type":"function","title":"Lightning.Workflows.Presence.build_presences_summary/2","doc":"Builds a summary of presences with details about the current user's presence, promotable presences,\nand edit priority.","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.build_presences_summary/2","doc":"- `presences` (list): A list of presence records, each containing user information and a joined_at timestamp.\n - `params` (map): A map containing the following keys:\n - `:current_user_presence` - The presence record for the current user.\n - `:current_user` - The current user record.\n - `:view_only_users_ids` - A list of user IDs who have view-only permissions.","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2-parameters"},{"type":"function","title":"Returns - Lightning.Workflows.Presence.build_presences_summary/2","doc":"- `map`: A map containing the following keys:\n - `:presences` - The sorted list of all presences.\n - `:prior_user_presence` - The presence record with edit priority.\n - `:current_user_presence` - The presence record for the current user.\n - `:has_presence_edit_priority` - A boolean indicating if the current user has edit priority.","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2-returns"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.build_presences_summary/2","doc":"iex> presences = [\n ...> %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n ...> %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},\n ...> %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}\n ...> ]\n iex> params = %{\n ...> current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n ...> current_user: %{id: 1},\n ...> view_only_users_ids: [2]\n ...> }\n iex> build_presences_summary(presences, params)\n %{\n presences: [\n %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n %{user: %{id: 2}, joined_at: ~N[2024-07-03 12:05:00], active_sessions: 1},\n %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1}\n ],\n prior_user_presence: %{user: %{id: 3}, joined_at: ~N[2024-07-03 12:10:00], active_sessions: 1},\n current_user_presence: %{user: %{id: 1}, joined_at: ~N[2024-07-03 12:00:00], active_sessions: 1},\n has_presence_edit_priority: true\n }","ref":"Lightning.Workflows.Presence.html#build_presences_summary/2-examples"},{"type":"function","title":"Lightning.Workflows.Presence.child_spec/1","doc":"","ref":"Lightning.Workflows.Presence.html#child_spec/1"},{"type":"function","title":"Lightning.Workflows.Presence.fetch/2","doc":"","ref":"Lightning.Workflows.Presence.html#fetch/2"},{"type":"function","title":"Lightning.Workflows.Presence.fetchers_pids/0","doc":"","ref":"Lightning.Workflows.Presence.html#fetchers_pids/0"},{"type":"function","title":"Lightning.Workflows.Presence.get_by_key/2","doc":"","ref":"Lightning.Workflows.Presence.html#get_by_key/2"},{"type":"function","title":"Lightning.Workflows.Presence.list/1","doc":"","ref":"Lightning.Workflows.Presence.html#list/1"},{"type":"function","title":"Lightning.Workflows.Presence.list_presences/1","doc":"Lists all presences for a given topic.","ref":"Lightning.Workflows.Presence.html#list_presences/1"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.list_presences/1","doc":"- `topic`: The topic to list the presences for.","ref":"Lightning.Workflows.Presence.html#list_presences/1-parameters"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.list_presences/1","doc":"iex> Lightning.Workflows.Presence.list_presences(\"workflow:canvas\")\n [%Lightning.Workflows.Presence{user: %User{id: 1}, ...}, ...]","ref":"Lightning.Workflows.Presence.html#list_presences/1-examples"},{"type":"function","title":"Lightning.Workflows.Presence.new_user_presence/3","doc":"Creates a new `UserPresence` struct.","ref":"Lightning.Workflows.Presence.html#new_user_presence/3"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.new_user_presence/3","doc":"- `user`: The user data to be included in the presence.\n - `joined_at`: The timestamp when the user joined, in microseconds.\n - `active_sessions`: The number of active sessions for the user (default is 0).","ref":"Lightning.Workflows.Presence.html#new_user_presence/3-parameters"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.new_user_presence/3","doc":"iex> Lightning.Workflows.Presence.new_user_presence(%User{id: 1}, 1625597762000000)\n %Lightning.Workflows.Presence{\n user: %User{id: 1},\n joined_at: 1625597762000000,\n active_sessions: 0\n }","ref":"Lightning.Workflows.Presence.html#new_user_presence/3-examples"},{"type":"function","title":"Lightning.Workflows.Presence.track/3","doc":"","ref":"Lightning.Workflows.Presence.html#track/3"},{"type":"function","title":"Lightning.Workflows.Presence.track/4","doc":"","ref":"Lightning.Workflows.Presence.html#track/4"},{"type":"function","title":"Lightning.Workflows.Presence.track_user_presence/3","doc":"Tracks the presence of a user on a given topic.","ref":"Lightning.Workflows.Presence.html#track_user_presence/3"},{"type":"function","title":"Parameters - Lightning.Workflows.Presence.track_user_presence/3","doc":"- `user`: The user to be tracked.\n - `topic`: The topic to track the user on.\n - `pid`: The process identifier for the user's session.","ref":"Lightning.Workflows.Presence.html#track_user_presence/3-parameters"},{"type":"function","title":"Examples - Lightning.Workflows.Presence.track_user_presence/3","doc":"iex> Lightning.Workflows.Presence.track_user_presence(%User{id: 1}, \"room:lobby\", self())\n :ok","ref":"Lightning.Workflows.Presence.html#track_user_presence/3-examples"},{"type":"function","title":"Lightning.Workflows.Presence.untrack/2","doc":"","ref":"Lightning.Workflows.Presence.html#untrack/2"},{"type":"function","title":"Lightning.Workflows.Presence.untrack/3","doc":"","ref":"Lightning.Workflows.Presence.html#untrack/3"},{"type":"function","title":"Lightning.Workflows.Presence.update/3","doc":"","ref":"Lightning.Workflows.Presence.html#update/3"},{"type":"function","title":"Lightning.Workflows.Presence.update/4","doc":"","ref":"Lightning.Workflows.Presence.html#update/4"},{"type":"module","title":"Lightning.Workflows.Query","doc":"Query module for finding Jobs.","ref":"Lightning.Workflows.Query.html"},{"type":"function","title":"Lightning.Workflows.Query.enabled_cron_jobs_by_edge/0","doc":"Returns active jobs with their cron triggers for use in the cron scheduling\nservice.","ref":"Lightning.Workflows.Query.html#enabled_cron_jobs_by_edge/0"},{"type":"function","title":"Lightning.Workflows.Query.jobs_for/1","doc":"Returns all jobs accessible to a user, via their projects\nor all jobs in a given project.","ref":"Lightning.Workflows.Query.html#jobs_for/1"},{"type":"module","title":"Lightning.Workflows.Scheduler","doc":"The Scheduler is responsible for finding jobs that are ready to run based on\ntheir cron schedule, and then running them.","ref":"Lightning.Workflows.Scheduler.html"},{"type":"function","title":"Lightning.Workflows.Scheduler.enqueue_cronjobs/0","doc":"Find and start any cronjobs that are scheduled to run for a given time\n(defaults to the current time).","ref":"Lightning.Workflows.Scheduler.html#enqueue_cronjobs/0"},{"type":"function","title":"Lightning.Workflows.Scheduler.enqueue_cronjobs/1","doc":"","ref":"Lightning.Workflows.Scheduler.html#enqueue_cronjobs/1"},{"type":"module","title":"Lightning.Workflows.Snapshot","doc":"Ecto model for Workflow Snapshots.\n\nSnapshots are a way to store the state of a workflow at a given point in time.","ref":"Lightning.Workflows.Snapshot.html"},{"type":"function","title":"Lightning.Workflows.Snapshot.build/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#build/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.create/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#create/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_all_by_ids/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_all_by_ids/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_all_for/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_all_for/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_by_version/2","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_by_version/2"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_current_for/1","doc":"Get the latest snapshot for a workflow, based on the lock_version.\n\nIt returns the latest snapshot regardless of the lock_version of the\nworkflow passed in. This is intentional to ensure that\n`get_or_create_latest_for/1` doesn't attempt to create a new snapshot if the\nworkflow has been updated elsewhere.","ref":"Lightning.Workflows.Snapshot.html#get_current_for/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_or_create_latest_for/1","doc":"Get the latest snapshot for a workflow, or create one if it doesn't exist.","ref":"Lightning.Workflows.Snapshot.html#get_or_create_latest_for/1"},{"type":"function","title":"Lightning.Workflows.Snapshot.get_or_create_latest_for/3","doc":"","ref":"Lightning.Workflows.Snapshot.html#get_or_create_latest_for/3"},{"type":"function","title":"Lightning.Workflows.Snapshot.new/1","doc":"","ref":"Lightning.Workflows.Snapshot.html#new/1"},{"type":"type","title":"Lightning.Workflows.Snapshot.t/0","doc":"","ref":"Lightning.Workflows.Snapshot.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.Snapshot.Edge","doc":"","ref":"Lightning.Workflows.Snapshot.Edge.html"},{"type":"module","title":"Lightning.Workflows.Snapshot.Job","doc":"","ref":"Lightning.Workflows.Snapshot.Job.html"},{"type":"module","title":"Lightning.Workflows.Snapshot.Trigger","doc":"","ref":"Lightning.Workflows.Snapshot.Trigger.html"},{"type":"module","title":"Lightning.Workflows.Trigger","doc":"Ecto model for Triggers.\n\nTriggers represent the criteria in which a Job might be invoked.","ref":"Lightning.Workflows.Trigger.html"},{"type":"module","title":"Types - Lightning.Workflows.Trigger","doc":"#","ref":"Lightning.Workflows.Trigger.html#module-types"},{"type":"module","title":"Webhook (default) - Lightning.Workflows.Trigger","doc":"A webhook trigger allows a Job to invoked (via `Lightning.Invocation`) when it's\nendpoint is called.","ref":"Lightning.Workflows.Trigger.html#module-webhook-default"},{"type":"function","title":"Lightning.Workflows.Trigger.new/1","doc":"","ref":"Lightning.Workflows.Trigger.html#new/1"},{"type":"function","title":"Lightning.Workflows.Trigger.validate/1","doc":"","ref":"Lightning.Workflows.Trigger.html#validate/1"},{"type":"function","title":"Lightning.Workflows.Trigger.with_auth_methods_query/0","doc":"","ref":"Lightning.Workflows.Trigger.html#with_auth_methods_query/0"},{"type":"type","title":"Lightning.Workflows.Trigger.t/0","doc":"","ref":"Lightning.Workflows.Trigger.html#t:t/0"},{"type":"type","title":"Lightning.Workflows.Trigger.trigger_type/0","doc":"","ref":"Lightning.Workflows.Trigger.html#t:trigger_type/0"},{"type":"module","title":"Lightning.Workflows.Triggers.Events","doc":"Responsible for the publishing of and subscription to trigger-related events.","ref":"Lightning.Workflows.Triggers.Events.html"},{"type":"function","title":"Lightning.Workflows.Triggers.Events.kafka_trigger_updated/1","doc":"","ref":"Lightning.Workflows.Triggers.Events.html#kafka_trigger_updated/1"},{"type":"function","title":"Lightning.Workflows.Triggers.Events.kafka_trigger_updated_topic/0","doc":"","ref":"Lightning.Workflows.Triggers.Events.html#kafka_trigger_updated_topic/0"},{"type":"function","title":"Lightning.Workflows.Triggers.Events.subscribe_to_kafka_trigger_updated/0","doc":"","ref":"Lightning.Workflows.Triggers.Events.html#subscribe_to_kafka_trigger_updated/0"},{"type":"module","title":"Lightning.Workflows.Triggers.KafkaConfiguration","doc":"Configuration of Kafka Triggers.","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.apply_hosts_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#apply_hosts_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.apply_topics_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#apply_topics_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.changeset/2","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.generate_hosts_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#generate_hosts_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.generate_topics_string/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#generate_topics_string/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.sasl_types/0","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#sasl_types/0"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.set_group_id_if_required/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#set_group_id_if_required/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.validate_initial_offset_reset_policy/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#validate_initial_offset_reset_policy/1"},{"type":"function","title":"Lightning.Workflows.Triggers.KafkaConfiguration.validate_sasl_credentials/1","doc":"","ref":"Lightning.Workflows.Triggers.KafkaConfiguration.html#validate_sasl_credentials/1"},{"type":"module","title":"Lightning.Workflows.WebhookAuthMethod","doc":"The `Lightning.Workflows.WebhookAuthMethod` module defines the schema for webhook authentication methods and provides functionalities to handle them.","ref":"Lightning.Workflows.WebhookAuthMethod.html"},{"type":"module","title":"Schema - Lightning.Workflows.WebhookAuthMethod","doc":"The schema represents a webhook authentication method that can be of two types - `:basic` and `:api`. The basic type requires a username and password, while the api type requires an api_key.\n\nThe schema fields include:\n - `name`: the name of the authentication method\n - `auth_type`: the type of authentication, can be `:basic` or `:api`\n - `username`: the username required for basic authentication\n - `password`: the password required for basic authentication (virtual field)\n - `hashed_password`: the hashed version of the password\n - `api_key`: the API key required for API authentication","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-schema"},{"type":"module","title":"Associations - Lightning.Workflows.WebhookAuthMethod","doc":"Each `WebhookAuthMethod` belongs to a `project`.\nIt is also associated with multiple `triggers` through a many_to_many relationship.","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-associations"},{"type":"module","title":"Validations and Constraints - Lightning.Workflows.WebhookAuthMethod","doc":"This module provides changeset functions for casting and validating the schema fields and applying unique constraints on `name`, `username`, and `api_key` within the project scope.","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-validations-and-constraints"},{"type":"module","title":"Password Verification - Lightning.Workflows.WebhookAuthMethod","doc":"The `valid_password?/2` function is provided to verify passwords and it avoids timing attacks by using `Bcrypt.no_user_verify/0` when there is no webhook_auth_method or the webhook_auth_method doesn't have a password.","ref":"Lightning.Workflows.WebhookAuthMethod.html#module-password-verification"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethod.changeset/2","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#changeset/2"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethod.generate_api_key/1","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#generate_api_key/1"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethod.update_changeset/2","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#update_changeset/2"},{"type":"type","title":"Lightning.Workflows.WebhookAuthMethod.t/0","doc":"","ref":"Lightning.Workflows.WebhookAuthMethod.html#t:t/0"},{"type":"module","title":"Lightning.Workflows.WebhookAuthMethodAudit","doc":"Model for storing changes to WebhookAuthMethod","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethodAudit.base_query/0","doc":"","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html#base_query/0"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethodAudit.event/4","doc":"","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html#event/4"},{"type":"function","title":"Lightning.Workflows.WebhookAuthMethodAudit.save/1","doc":"","ref":"Lightning.Workflows.WebhookAuthMethodAudit.html#save/1"},{"type":"module","title":"Lightning.Workflows.Workflow","doc":"Ecto model for Workflows.\n\nA Workflow contains the fields for defining a workflow.\n\n* `name`\n A plain text identifier","ref":"Lightning.Workflows.Workflow.html"},{"type":"function","title":"Lightning.Workflows.Workflow.request_deletion_changeset/2","doc":"","ref":"Lightning.Workflows.Workflow.html#request_deletion_changeset/2"},{"type":"function","title":"Lightning.Workflows.Workflow.touch/1","doc":"Forces an update to the workflows `updated_at` timestamp and the\n`lock_version`. This is useful when updating a child record like jobs or\ntriggers and a snapshot needs to made; but the Workflow itself didn't change.","ref":"Lightning.Workflows.Workflow.html#touch/1"},{"type":"function","title":"Lightning.Workflows.Workflow.validate/1","doc":"","ref":"Lightning.Workflows.Workflow.html#validate/1"},{"type":"function","title":"Lightning.Workflows.Workflow.workflow_activated?/1","doc":"Returns true if the workflow has any triggers that are _going to be_ activated.\n\nNew triggers are enabled by default, but existing triggers are only considered\nactivated if their `enabled` field is _changed_ to `true`.","ref":"Lightning.Workflows.Workflow.html#workflow_activated?/1"},{"type":"type","title":"Lightning.Workflows.Workflow.t/0","doc":"","ref":"Lightning.Workflows.Workflow.html#t:t/0"},{"type":"module","title":"Lightning.LogMessage","doc":"A custom type to handle JSON log messages.\n\nCurrently the underlying database type is a string, and workers may send\neither a string, or a JSON object. This type will encode JSON objects to\nstring.\n\n> ##","ref":"Lightning.LogMessage.html"},{"type":"module","title":"Messages are always strings {: .info} - Lightning.LogMessage","doc":">\n> While this type allows JSON objects to be sent, the model will always return\n> strings. This type is a stand-in until we want to add a JSONB column to the\n> underlying table.\n\nIn the case of JSON objects we serialize them to a string, and in the case of\narrays we serialize them individually and join them with a space.","ref":"Lightning.LogMessage.html#module-messages-are-always-strings-info"},{"type":"function","title":"Lightning.LogMessage.cast/1","doc":"","ref":"Lightning.LogMessage.html#cast/1"},{"type":"function","title":"Lightning.LogMessage.dump/1","doc":"","ref":"Lightning.LogMessage.html#dump/1"},{"type":"function","title":"Lightning.LogMessage.embed_as/1","doc":"","ref":"Lightning.LogMessage.html#embed_as/1"},{"type":"function","title":"Lightning.LogMessage.equal?/2","doc":"","ref":"Lightning.LogMessage.html#equal?/2"},{"type":"function","title":"Lightning.LogMessage.load/1","doc":"","ref":"Lightning.LogMessage.html#load/1"},{"type":"function","title":"Lightning.LogMessage.type/0","doc":"","ref":"Lightning.LogMessage.html#type/0"},{"type":"module","title":"Lightning.UnixDateTime","doc":"A custom DateTime type for Ecto that uses millisecond Unix timestamps.\n\nNodeJS uses millisecond Unix timestamps, and Ecto has a choice of either\nsecond or microsecond precision. This module allows millisecond precision\nintegers to be used as DateTime values without losing precision.\n\nMicrosecond timestamps can also be parsed, but currently they are expected\nto be provided as strings. This is because Javascript can't represent\nmicrosecond timestamps as an integer and BigInt can't be represented\nas a JSON value.\n\nAll functions fallback on the default Ecto types conversion functions.","ref":"Lightning.UnixDateTime.html"},{"type":"function","title":"Lightning.UnixDateTime.cast/1","doc":"Cast a Unix timestamp to a DateTime.\n\nAccepts integers and strings, and will try to parse the string as an integer.\nIf the integer is 13 digits long, it will be parsed as a millisecond\ntimestamp, and as a microsecond timestamp if it is 16 digits long.","ref":"Lightning.UnixDateTime.html#cast/1"},{"type":"function","title":"Lightning.UnixDateTime.dump/1","doc":"","ref":"Lightning.UnixDateTime.html#dump/1"},{"type":"function","title":"Lightning.UnixDateTime.embed_as/1","doc":"","ref":"Lightning.UnixDateTime.html#embed_as/1"},{"type":"function","title":"Lightning.UnixDateTime.equal?/2","doc":"","ref":"Lightning.UnixDateTime.html#equal?/2"},{"type":"function","title":"Lightning.UnixDateTime.load/1","doc":"","ref":"Lightning.UnixDateTime.html#load/1"},{"type":"function","title":"Lightning.UnixDateTime.type/0","doc":"","ref":"Lightning.UnixDateTime.html#type/0"},{"type":"module","title":"LightningWeb","doc":"The entrypoint for defining your web interface, such\nas controllers, views, channels and so on.\n\nThis can be used in your application as:\n\n use LightningWeb, :controller\n use LightningWeb, :view\n\nThe definitions below will be executed for every view,\ncontroller, etc, so keep them short and clean, focused\non imports, uses and aliases.\n\nDo NOT define functions inside the quoted expressions\nbelow. Instead, define any helper function in modules\nand import those modules here.","ref":"LightningWeb.html"},{"type":"macro","title":"LightningWeb.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"LightningWeb.html#__using__/1"},{"type":"function","title":"LightningWeb.channel/0","doc":"","ref":"LightningWeb.html#channel/0"},{"type":"function","title":"LightningWeb.component/0","doc":"","ref":"LightningWeb.html#component/0"},{"type":"function","title":"LightningWeb.controller/0","doc":"","ref":"LightningWeb.html#controller/0"},{"type":"function","title":"LightningWeb.html/0","doc":"","ref":"LightningWeb.html#html/0"},{"type":"function","title":"LightningWeb.live_component/0","doc":"","ref":"LightningWeb.html#live_component/0"},{"type":"function","title":"LightningWeb.live_view/1","doc":"","ref":"LightningWeb.html#live_view/1"},{"type":"function","title":"LightningWeb.router/0","doc":"","ref":"LightningWeb.html#router/0"},{"type":"function","title":"LightningWeb.static_paths/0","doc":"","ref":"LightningWeb.html#static_paths/0"},{"type":"function","title":"LightningWeb.verified_routes/0","doc":"","ref":"LightningWeb.html#verified_routes/0"},{"type":"function","title":"LightningWeb.view/0","doc":"","ref":"LightningWeb.html#view/0"},{"type":"module","title":"LightningWeb.API.Helpers","doc":"Helpers for the API views","ref":"LightningWeb.API.Helpers.html"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_link/3","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_link/3"},{"type":"function","title":"LightningWeb.API.Helpers.pagination_links/2","doc":"","ref":"LightningWeb.API.Helpers.html#pagination_links/2"},{"type":"function","title":"LightningWeb.API.Helpers.url_for/2","doc":"","ref":"LightningWeb.API.Helpers.html#url_for/2"},{"type":"module","title":"LightningWeb.API.JobController","doc":"","ref":"LightningWeb.API.JobController.html"},{"type":"function","title":"LightningWeb.API.JobController.index/2","doc":"","ref":"LightningWeb.API.JobController.html#index/2"},{"type":"function","title":"LightningWeb.API.JobController.show/2","doc":"","ref":"LightningWeb.API.JobController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProjectController","doc":"","ref":"LightningWeb.API.ProjectController.html"},{"type":"function","title":"LightningWeb.API.ProjectController.index/2","doc":"","ref":"LightningWeb.API.ProjectController.html#index/2"},{"type":"function","title":"LightningWeb.API.ProjectController.show/2","doc":"","ref":"LightningWeb.API.ProjectController.html#show/2"},{"type":"module","title":"LightningWeb.API.ProvisioningController","doc":"","ref":"LightningWeb.API.ProvisioningController.html"},{"type":"function","title":"LightningWeb.API.ProvisioningController.create/2","doc":"Creates or updates a project based on a JSON payload that may or may not\ncontain UUIDs for existing resources.","ref":"LightningWeb.API.ProvisioningController.html#create/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show/2","doc":"Returns a project \"state.json\", complete with UUIDs to enable idempotent\nproject deployments and updates to existing projects via the CLI.","ref":"LightningWeb.API.ProvisioningController.html#show/2"},{"type":"function","title":"LightningWeb.API.ProvisioningController.show_yaml/2","doc":"Returns a description of the project as yaml. Same as the export project to\nyaml button (see Downloads Controller) but made for the API.","ref":"LightningWeb.API.ProvisioningController.html#show_yaml/2"},{"type":"module","title":"LightningWeb.API.RegistrationController","doc":"","ref":"LightningWeb.API.RegistrationController.html"},{"type":"function","title":"LightningWeb.API.RegistrationController.create/2","doc":"","ref":"LightningWeb.API.RegistrationController.html#create/2"},{"type":"module","title":"LightningWeb.AccountConfirmationModal","doc":"A LiveView component for displaying an account confirmation modal.\n\nThis component is responsible for informing users that access to their\naccounts, projects, and workflows is restricted until they confirm\ntheir account. It provides functionality to resend the confirmation\nemail and allows users to update their email address if needed.","ref":"LightningWeb.AccountConfirmationModal.html"},{"type":"module","title":"Features - LightningWeb.AccountConfirmationModal","doc":"- Displays a modal with instructions for account confirmation.\n- Allows users to resend the confirmation email.\n- Provides feedback when the confirmation email is successfully sent.\n- Allows users to navigate to the profile page to update their email address.","ref":"LightningWeb.AccountConfirmationModal.html#module-features"},{"type":"module","title":"Usage - LightningWeb.AccountConfirmationModal","doc":"Include this component in your LiveView template where you need to prompt\nusers to confirm their account. The component determines whether the modal\nshould be shown based on the current view context.","ref":"LightningWeb.AccountConfirmationModal.html#module-usage"},{"type":"module","title":"Examples - LightningWeb.AccountConfirmationModal","doc":"The component uses assigns to manage its state, including:\n\n- `:show_modal` - Determines if the modal should be visible.\n- `:email_sent` - Indicates if the confirmation email was successfully sent.","ref":"LightningWeb.AccountConfirmationModal.html#module-examples"},{"type":"module","title":"LightningWeb.AuditLive.Index","doc":"LiveView for listing Audit events","ref":"LightningWeb.AuditLive.Index.html"},{"type":"function","title":"LightningWeb.AuditLive.Index.diff/1","doc":"","ref":"LightningWeb.AuditLive.Index.html#diff/1"},{"type":"function","title":"LightningWeb.AuditLive.Index.render/1","doc":"","ref":"LightningWeb.AuditLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.AuthProvidersLive.FormComponent","doc":"Form Component for working with a single Job\n\nA Job's `adaptor` field is a combination of the module name and the version.\nIt's formatted as an NPM style string.\n\nThe form allows the user to select a module by name and then it's version,\nwhile the version dropdown itself references `adaptor` directly.\n\nMeaning the `adaptor_name` dropdown and assigns value is not persisted.","ref":"LightningWeb.AuthProvidersLive.FormComponent.html"},{"type":"module","title":"LightningWeb.AuthProvidersLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.AuthProvidersLive.Index.html"},{"type":"module","title":"LightningWeb.BackupCodesController","doc":"","ref":"LightningWeb.BackupCodesController.html"},{"type":"function","title":"LightningWeb.BackupCodesController.print/2","doc":"","ref":"LightningWeb.BackupCodesController.html#print/2"},{"type":"module","title":"LightningWeb.BackupCodesLive.Index","doc":"LiveView for user backup codes.","ref":"LightningWeb.BackupCodesLive.Index.html"},{"type":"function","title":"LightningWeb.BackupCodesLive.Index.render/1","doc":"","ref":"LightningWeb.BackupCodesLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ChangesetJSON","doc":"Renders changesets as JSON.","ref":"LightningWeb.ChangesetJSON.html"},{"type":"function","title":"LightningWeb.ChangesetJSON.error/1","doc":"","ref":"LightningWeb.ChangesetJSON.html#error/1"},{"type":"module","title":"LightningWeb.ChangesetView","doc":"","ref":"LightningWeb.ChangesetView.html"},{"type":"function","title":"LightningWeb.ChangesetView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ChangesetView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ChangesetView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ChangesetView.html#render/2"},{"type":"function","title":"LightningWeb.ChangesetView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"LightningWeb.ChangesetView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.ChannelHelpers","doc":"Helper functions for channels","ref":"LightningWeb.ChannelHelpers.html"},{"type":"function","title":"LightningWeb.ChannelHelpers.reply_with/2","doc":"","ref":"LightningWeb.ChannelHelpers.html#reply_with/2"},{"type":"module","title":"LightningWeb.Components.Loaders","doc":"UI component to render a pill to create tags.","ref":"LightningWeb.Components.Loaders.html"},{"type":"function","title":"LightningWeb.Components.Loaders.button_loader/1","doc":"","ref":"LightningWeb.Components.Loaders.html#button_loader/1"},{"type":"function","title":"Slots - LightningWeb.Components.Loaders.button_loader/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Loaders.html#button_loader/1-slots"},{"type":"function","title":"LightningWeb.Components.Loaders.offline_indicator/1","doc":"","ref":"LightningWeb.Components.Loaders.html#offline_indicator/1"},{"type":"function","title":"LightningWeb.Components.Loaders.text_ping_loader/1","doc":"","ref":"LightningWeb.Components.Loaders.html#text_ping_loader/1"},{"type":"function","title":"Slots - LightningWeb.Components.Loaders.text_ping_loader/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Loaders.html#text_ping_loader/1-slots"},{"type":"module","title":"LightningWeb.Components.Menu","doc":"Menu components to render menu items for project and user/profile pages.","ref":"LightningWeb.Components.Menu.html"},{"type":"function","title":"LightningWeb.Components.Menu.menu_item/1","doc":"","ref":"LightningWeb.Components.Menu.html#menu_item/1"},{"type":"function","title":"LightningWeb.Components.Menu.profile_items/1","doc":"","ref":"LightningWeb.Components.Menu.html#profile_items/1"},{"type":"function","title":"LightningWeb.Components.Menu.project_items/1","doc":"","ref":"LightningWeb.Components.Menu.html#project_items/1"},{"type":"module","title":"LightningWeb.Components.Modal","doc":"A modal component that can be used to display a modal on the page.\n\nThis currently isn't used anywhere but should be used in the future to\nreplace the existing modal implementations.","ref":"LightningWeb.Components.Modal.html"},{"type":"function","title":"LightningWeb.Components.Modal.hide_modal/2","doc":"","ref":"LightningWeb.Components.Modal.html#hide_modal/2"},{"type":"function","title":"LightningWeb.Components.Modal.modal/1","doc":"","ref":"LightningWeb.Components.Modal.html#modal/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Modal.modal/1","doc":"* `id` (`:string`) (required)\n* `show` (`:boolean`) - Defaults to `false`.\n* `type` (`:string`) - Defaults to `\"default\"`.\n* `position` (`:string`) - Defaults to `\"relative\"`.\n* `width` (`:string`) - Defaults to `\"max-w-3xl\"`.\n* `close_on_click_away` (`:boolean`) - Defaults to `true`.\n* `close_on_keydown` (`:boolean`) - Defaults to `true`.\n* `on_close` (`Phoenix.LiveView.JS`) - Defaults to `%Phoenix.LiveView.JS{ops: []}`.\n* `on_open` (`Phoenix.LiveView.JS`) - Defaults to `%Phoenix.LiveView.JS{ops: []}`.\n* Global attributes are accepted.","ref":"LightningWeb.Components.Modal.html#modal/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.Modal.modal/1","doc":"* `inner_block` (required)\n* `title`\n* `subtitle`\n* `footer` - Accepts attributes:\n\n * `class` (`:string`)","ref":"LightningWeb.Components.Modal.html#modal/1-slots"},{"type":"function","title":"LightningWeb.Components.Modal.modal_footer/1","doc":"","ref":"LightningWeb.Components.Modal.html#modal_footer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Modal.modal_footer/1","doc":"* `class` (`:any`) - Defaults to `\"\"`.","ref":"LightningWeb.Components.Modal.html#modal_footer/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.Modal.modal_footer/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Modal.html#modal_footer/1-slots"},{"type":"function","title":"LightningWeb.Components.Modal.show_modal/2","doc":"","ref":"LightningWeb.Components.Modal.html#show_modal/2"},{"type":"module","title":"LightningWeb.Components.NewInputs","doc":"A temporary module that will serve as a place to put new inputs that conform\nwith the newer CoreComponents conventions introduced in Phoenix 1.7.","ref":"LightningWeb.Components.NewInputs.html"},{"type":"function","title":"LightningWeb.Components.NewInputs.button/1","doc":"Renders a button.","ref":"LightningWeb.Components.NewInputs.html#button/1"},{"type":"function","title":"Examples - LightningWeb.Components.NewInputs.button/1","doc":"Send! \n Send!","ref":"LightningWeb.Components.NewInputs.html#button/1-examples"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.button/1","doc":"* `id` (`:string`) - Defaults to `\"\"`.\n* `type` (`:string`) - Defaults to `\"button\"`.\n* `class` (`:any`) - Defaults to `\"\"`.\n* `color_class` (`:any`) - Defaults to `\"bg-primary-600 hover:bg-primary-700 text-white focus:ring-primary-500 disabled:bg-primary-300\"`.\n* `tooltip` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"disabled\", \"form\", \"name\", \"value\"]`.","ref":"LightningWeb.Components.NewInputs.html#button/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.button/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.NewInputs.html#button/1-slots"},{"type":"function","title":"LightningWeb.Components.NewInputs.error/1","doc":"Generates a generic error message.","ref":"LightningWeb.Components.NewInputs.html#error/1"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.error/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.NewInputs.html#error/1-slots"},{"type":"function","title":"LightningWeb.Components.NewInputs.errors/1","doc":"Generic wrapper for rendering error messages in custom input components.","ref":"LightningWeb.Components.NewInputs.html#errors/1"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.errors/1","doc":"* `field` (`Phoenix.HTML.FormField`) (required)","ref":"LightningWeb.Components.NewInputs.html#errors/1-attributes"},{"type":"function","title":"LightningWeb.Components.NewInputs.input/1","doc":"Renders an input with label and error messages.\n\nA `Phoenix.HTML.FormField` may be passed as argument,\nwhich is used to retrieve the input name, id, and values.\nOtherwise all attributes may be passed explicitly.","ref":"LightningWeb.Components.NewInputs.html#input/1"},{"type":"function","title":"Types - LightningWeb.Components.NewInputs.input/1","doc":"This function accepts all HTML input types, considering that:\n\n * You may also set `type=\"select\"` to render a ` ` tag\n\n * `type=\"checkbox\"` is used exclusively to render boolean values\n\n * For live file uploads, see `Phoenix.Component.live_file_input/1`\n\nSee https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input\nfor more information.","ref":"LightningWeb.Components.NewInputs.html#input/1-types"},{"type":"function","title":"Examples - LightningWeb.Components.NewInputs.input/1","doc":"","ref":"LightningWeb.Components.NewInputs.html#input/1-examples"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.input/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `name` (`:any`)\n* `label` (`:string`) - Defaults to `nil`.\n* `value` (`:any`)\n* `type` (`:string`) - Defaults to `\"text\"`.\n* `field` (`Phoenix.HTML.FormField`) - a form field struct retrieved from the form, for example: @form[:email].\n* `errors` (`:list`) - Defaults to `[]`.\n* `checked` (`:boolean`) - the checked flag for checkbox inputs.\n* `checked_value` (`:any`) - the value to be sent when the checkbox is checked. Defaults to 'true'. Defaults to `\"true\"`.\n* `unchecked_value` (`:any`) - the value to be sent when the checkbox is unchecked, Defaults to 'false'. Defaults to `\"false\"`.\n* `hidden_input` (`:boolean`) - controls if this function will generate a hidden input to submit the unchecked value or not. Defaults to 'true'. Defaults to `true`.\n* `prompt` (`:string`) - the prompt for select inputs. Defaults to `nil`.\n* `options` (`:list`) - the options to pass to Phoenix.HTML.Form.options_for_select/2.\n* `multiple` (`:boolean`) - the multiple flag for select inputs. Defaults to `false`.\n* `button_placement` (`:string`) - Defaults to `nil`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `display_errors` (`:boolean`) - Defaults to `true`.\n* `tooltip` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"accept\", \"autocomplete\", \"capture\", \"cols\", \"disabled\", \"form\", \"list\", \"max\", \"maxlength\", \"min\", \"minlength\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"size\", \"step\"]`.","ref":"LightningWeb.Components.NewInputs.html#input/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.input/1","doc":"* `inner_block`","ref":"LightningWeb.Components.NewInputs.html#input/1-slots"},{"type":"function","title":"LightningWeb.Components.NewInputs.input_element/1","doc":"Renders an input element.\n\nThis function is used internally by `input/1` and generally should not\nbe used directly.\n\nIn the case of inputs that are different enough to warrant a new function,\nthis component can be used to maintain style consistency.","ref":"LightningWeb.Components.NewInputs.html#input_element/1"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.input_element/1","doc":"* `id` (`:string`) - Defaults to `nil`.\n* `name` (`:string`) (required)\n* `type` (`:string`) (required)\n* `value` (`:any`)\n* `errors` (`:list`) - Defaults to `[]`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"LightningWeb.Components.NewInputs.html#input_element/1-attributes"},{"type":"function","title":"LightningWeb.Components.NewInputs.label/1","doc":"Renders a label.","ref":"LightningWeb.Components.NewInputs.html#label/1"},{"type":"function","title":"Attributes - LightningWeb.Components.NewInputs.label/1","doc":"* `for` (`:any`) - Defaults to `nil`.\n* `class` (`:any`) - Defaults to `\"\"`.","ref":"LightningWeb.Components.NewInputs.html#label/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.NewInputs.label/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.NewInputs.html#label/1-slots"},{"type":"module","title":"LightningWeb.Components.Pills","doc":"UI component to render a pill to create tags.","ref":"LightningWeb.Components.Pills.html"},{"type":"function","title":"LightningWeb.Components.Pills.pill/1","doc":"","ref":"LightningWeb.Components.Pills.html#pill/1"},{"type":"function","title":"Slots - LightningWeb.Components.Pills.pill/1","doc":"* `inner_block` (required)","ref":"LightningWeb.Components.Pills.html#pill/1-slots"},{"type":"module","title":"LightningWeb.Components.Viewers","doc":"Components for rendering Logs and Dataclips.\n\n> ##","ref":"LightningWeb.Components.Viewers.html"},{"type":"module","title":"Scrolling can be tricky {: .info} - LightningWeb.Components.Viewers","doc":">\n> We seldom know how long a log or a dataclip will be, and we want to\n> be able to contain the element in a fixed height container.\n> In some situations wrapping the component in a `div` with `inline-flex`\n> class will help with scrolling.","ref":"LightningWeb.Components.Viewers.html#module-scrolling-can-be-tricky-info"},{"type":"function","title":"LightningWeb.Components.Viewers.dataclip_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#dataclip_viewer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.dataclip_viewer/1","doc":"* `id` (`:string`) (required)\n* `dataclip` (`:map`) (required)","ref":"LightningWeb.Components.Viewers.html#dataclip_viewer/1-attributes"},{"type":"function","title":"LightningWeb.Components.Viewers.log_viewer/1","doc":"Renders out a log line stream\n\nInternally it uses the `LogLineHighlight` hook to highlight the log line\nwith the `highlight_id` attribute.","ref":"LightningWeb.Components.Viewers.html#log_viewer/1"},{"type":"function","title":"Example - LightningWeb.Components.Viewers.log_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#log_viewer/1-example"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.log_viewer/1","doc":"* `id` (`:string`) (required)\n* `run_id` (`:string`) (required)\n* `run_state` (`:any`) (required)\n* `logs_empty?` (`:boolean`) (required)\n* `selected_step_id` (`:string`)\n* `class` (`:string`) - Additional classes to add to the log viewer container. Defaults to `nil`.","ref":"LightningWeb.Components.Viewers.html#log_viewer/1-attributes"},{"type":"function","title":"LightningWeb.Components.Viewers.step_dataclip_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#step_dataclip_viewer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.step_dataclip_viewer/1","doc":"* `id` (`:string`) (required)\n* `run_state` (`:any`) (required)\n* `class` (`:string`) - Additional classes to add to the log viewer container. Defaults to `nil`.\n* `step` (`:map`)\n* `dataclip` (`Lightning.Invocation.Dataclip`)\n* `input_or_output` (`:atom`) (required) - Must be one of `:input`, or `:output`.\n* `project_id` (`:string`) (required)\n* `admin_contacts` (`:list`) (required) - list of project admin emails.\n* `can_edit_data_retention` (`:boolean`) (required)","ref":"LightningWeb.Components.Viewers.html#step_dataclip_viewer/1-attributes"},{"type":"function","title":"LightningWeb.Components.Viewers.wiped_dataclip_viewer/1","doc":"","ref":"LightningWeb.Components.Viewers.html#wiped_dataclip_viewer/1"},{"type":"function","title":"Attributes - LightningWeb.Components.Viewers.wiped_dataclip_viewer/1","doc":"* `id` (`:string`) - Defaults to `nil`.\n* `input_or_output` (`:atom`) (required) - Must be one of `:input`, or `:output`.\n* `project_id` (`:string`) (required)\n* `admin_contacts` (`:list`) (required) - list of project admin emails.\n* `can_edit_data_retention` (`:boolean`) (required)","ref":"LightningWeb.Components.Viewers.html#wiped_dataclip_viewer/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Components.Viewers.wiped_dataclip_viewer/1","doc":"* `footer`","ref":"LightningWeb.Components.Viewers.html#wiped_dataclip_viewer/1-slots"},{"type":"module","title":"LightningWeb.CredentialLive.CredentialFormComponent","doc":"Form Component for working with a single Credential","ref":"LightningWeb.CredentialLive.CredentialFormComponent.html"},{"type":"module","title":"LightningWeb.CredentialLive.GenericOauthComponent","doc":"","ref":"LightningWeb.CredentialLive.GenericOauthComponent.html"},{"type":"module","title":"LightningWeb.CredentialLive.Helpers","doc":"This module provides helper functions for managing project associations\nwithin credential live views, allowing dynamic assignment and update\nof projects associations to credentials and / or oauth clients.","ref":"LightningWeb.CredentialLive.Helpers.html"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.filter_available_projects/2","doc":"Filters available projects to exclude any that are already selected.","ref":"LightningWeb.CredentialLive.Helpers.html#filter_available_projects/2"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.filter_available_projects/2","doc":"- `all_projects`: A list of all projects.\n- `selected_projects`: A list of currently selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#filter_available_projects/2-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.filter_available_projects/2","doc":"- A list of projects that are not selected.","ref":"LightningWeb.CredentialLive.Helpers.html#filter_available_projects/2-returns"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.handle_save_response/2","doc":"","ref":"LightningWeb.CredentialLive.Helpers.html#handle_save_response/2"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.prepare_projects_associations/3","doc":"Prepares a list of projects to be associated, updated, or removed based on the selected input.","ref":"LightningWeb.CredentialLive.Helpers.html#prepare_projects_associations/3"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.prepare_projects_associations/3","doc":"- `changeset`: The changeset from which projects are fetched.\n- `selected_projects`: A list of currently selected projects.\n- `assoc_key`: The key in the changeset data containing project associations.","ref":"LightningWeb.CredentialLive.Helpers.html#prepare_projects_associations/3-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.prepare_projects_associations/3","doc":"- A list of maps representing the projects to be deleted, added, or kept.","ref":"LightningWeb.CredentialLive.Helpers.html#prepare_projects_associations/3-returns"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.select_project/4","doc":"Selects a project to be added to the list of selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#select_project/4"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.select_project/4","doc":"- `project_id`: The ID of the project to select.\n- `projects`: All available projects.\n- `available_projects`: Projects that are available for selection.\n- `selected_projects`: Currently selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#select_project/4-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.select_project/4","doc":"- A map with the updated lists of selected and available projects.","ref":"LightningWeb.CredentialLive.Helpers.html#select_project/4-returns"},{"type":"function","title":"LightningWeb.CredentialLive.Helpers.unselect_project/3","doc":"Unselects a project from the list of selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#unselect_project/3"},{"type":"function","title":"Parameters - LightningWeb.CredentialLive.Helpers.unselect_project/3","doc":"- `project_id`: The ID of the project to unselect.\n- `projects`: All projects available.\n- `selected_projects`: Currently selected projects.","ref":"LightningWeb.CredentialLive.Helpers.html#unselect_project/3-parameters"},{"type":"function","title":"Returns - LightningWeb.CredentialLive.Helpers.unselect_project/3","doc":"- A map with the updated lists of selected and available projects.","ref":"LightningWeb.CredentialLive.Helpers.html#unselect_project/3-returns"},{"type":"module","title":"LightningWeb.CredentialLive.Index","doc":"LiveView for listing and managing credentials","ref":"LightningWeb.CredentialLive.Index.html"},{"type":"function","title":"LightningWeb.CredentialLive.Index.delete_action/1","doc":"","ref":"LightningWeb.CredentialLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.CredentialLive.Index.handle_info/2","doc":"A generic handler for forwarding updates from PubSub","ref":"LightningWeb.CredentialLive.Index.html#handle_info/2"},{"type":"function","title":"LightningWeb.CredentialLive.Index.render/1","doc":"","ref":"LightningWeb.CredentialLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"* `form` (`:map`) (required)","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1-attributes"},{"type":"function","title":"Slots - LightningWeb.CredentialLive.JsonSchemaBodyComponent.fieldset/1","doc":"* `inner_block`","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#fieldset/1-slots"},{"type":"function","title":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.schema_input/1","doc":"","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#schema_input/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.JsonSchemaBodyComponent.schema_input/1","doc":"* `form` (`:map`) (required)\n* `schema` (`:map`) (required)\n* `field` (`:any`) (required)","ref":"LightningWeb.CredentialLive.JsonSchemaBodyComponent.html#schema_input/1-attributes"},{"type":"module","title":"LightningWeb.CredentialLive.OauthClientFormComponent","doc":"Form Component for working with a single Credential","ref":"LightningWeb.CredentialLive.OauthClientFormComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.OauthClientFormComponent.global_client_checkbox/1","doc":"","ref":"LightningWeb.CredentialLive.OauthClientFormComponent.html#global_client_checkbox/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.OauthClientFormComponent.global_client_checkbox/1","doc":"* `form` (`:any`) (required)","ref":"LightningWeb.CredentialLive.OauthClientFormComponent.html#global_client_checkbox/1-attributes"},{"type":"module","title":"LightningWeb.CredentialLive.OauthComponent","doc":"","ref":"LightningWeb.CredentialLive.OauthComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.OauthComponent.fieldset/1","doc":"","ref":"LightningWeb.CredentialLive.OauthComponent.html#fieldset/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.OauthComponent.fieldset/1","doc":"* `form` (`:map`) (required)\n* `id` (`:string`) (required)\n* `update_body` (`:any`) (required)\n* `action` (`:any`) (required)\n* `scopes_changed` (`:boolean`) - Defaults to `false`.\n* `sandbox_changed` (`:boolean`) - Defaults to `false`.\n* `schema` (`:string`) (required)","ref":"LightningWeb.CredentialLive.OauthComponent.html#fieldset/1-attributes"},{"type":"function","title":"Slots - LightningWeb.CredentialLive.OauthComponent.fieldset/1","doc":"* `inner_block`","ref":"LightningWeb.CredentialLive.OauthComponent.html#fieldset/1-slots"},{"type":"module","title":"LightningWeb.CredentialLive.RawBodyComponent","doc":"","ref":"LightningWeb.CredentialLive.RawBodyComponent.html"},{"type":"function","title":"LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1"},{"type":"function","title":"Attributes - LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"* `form` (`:map`) (required)","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1-attributes"},{"type":"function","title":"Slots - LightningWeb.CredentialLive.RawBodyComponent.fieldset/1","doc":"* `inner_block`","ref":"LightningWeb.CredentialLive.RawBodyComponent.html#fieldset/1-slots"},{"type":"module","title":"LightningWeb.DashboardLive.Components","doc":"","ref":"LightningWeb.DashboardLive.Components.html"},{"type":"function","title":"LightningWeb.DashboardLive.Components.user_projects_table/1","doc":"","ref":"LightningWeb.DashboardLive.Components.html#user_projects_table/1"},{"type":"module","title":"LightningWeb.DashboardLive.Index","doc":"","ref":"LightningWeb.DashboardLive.Index.html"},{"type":"module","title":"LightningWeb.DashboardLive.ProjectCreationModal","doc":"","ref":"LightningWeb.DashboardLive.ProjectCreationModal.html"},{"type":"module","title":"LightningWeb.DataclipController","doc":"","ref":"LightningWeb.DataclipController.html"},{"type":"function","title":"LightningWeb.DataclipController.show/2","doc":"","ref":"LightningWeb.DataclipController.html#show/2"},{"type":"module","title":"LightningWeb.DataclipLive.FormComponent","doc":"Form Component for working with a single dataclip","ref":"LightningWeb.DataclipLive.FormComponent.html"},{"type":"function","title":"LightningWeb.DataclipLive.FormComponent.render/1","doc":"","ref":"LightningWeb.DataclipLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.DataclipLive.Show","doc":"LiveView for showing a single dataclip.","ref":"LightningWeb.DataclipLive.Show.html"},{"type":"module","title":"LightningWeb.DownloadsController","doc":"","ref":"LightningWeb.DownloadsController.html"},{"type":"function","title":"LightningWeb.DownloadsController.download_project_yaml/2","doc":"","ref":"LightningWeb.DownloadsController.html#download_project_yaml/2"},{"type":"module","title":"LightningWeb.Endpoint","doc":"","ref":"LightningWeb.Endpoint.html"},{"type":"function","title":"LightningWeb.Endpoint.broadcast/3","doc":"","ref":"LightningWeb.Endpoint.html#broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast!/3","doc":"","ref":"LightningWeb.Endpoint.html#broadcast!/3"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from/4","doc":"","ref":"LightningWeb.Endpoint.html#broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.broadcast_from!/4","doc":"","ref":"LightningWeb.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"LightningWeb.Endpoint.call/2","doc":"","ref":"LightningWeb.Endpoint.html#call/2"},{"type":"function","title":"LightningWeb.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"LightningWeb.Endpoint.html#child_spec/1"},{"type":"function","title":"LightningWeb.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"LightningWeb.Endpoint.html#config/2"},{"type":"function","title":"LightningWeb.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"LightningWeb.Endpoint.html#config_change/2"},{"type":"function","title":"LightningWeb.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"LightningWeb.Endpoint.html#host/0"},{"type":"function","title":"LightningWeb.Endpoint.init/1","doc":"","ref":"LightningWeb.Endpoint.html#init/1"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast/3","doc":"","ref":"LightningWeb.Endpoint.html#local_broadcast/3"},{"type":"function","title":"LightningWeb.Endpoint.local_broadcast_from/4","doc":"","ref":"LightningWeb.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"LightningWeb.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"LightningWeb.Endpoint.html#path/1"},{"type":"function","title":"LightningWeb.Endpoint.script_name/0","doc":"Generates the script name.","ref":"LightningWeb.Endpoint.html#script_name/0"},{"type":"function","title":"LightningWeb.Endpoint.server_info/1","doc":"Returns the address and port that the server is running on","ref":"LightningWeb.Endpoint.html#server_info/1"},{"type":"function","title":"LightningWeb.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"LightningWeb.Endpoint.html#start_link/1"},{"type":"function","title":"LightningWeb.Endpoint.static_integrity/1","doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file\nin `priv/static`. Meant to be used for Subresource Integrity with CDNs.","ref":"LightningWeb.Endpoint.html#static_integrity/1"},{"type":"function","title":"LightningWeb.Endpoint.static_lookup/1","doc":"Returns a two item tuple with the first item being the `static_path`\nand the second item being the `static_integrity`.","ref":"LightningWeb.Endpoint.html#static_lookup/1"},{"type":"function","title":"LightningWeb.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"LightningWeb.Endpoint.html#static_path/1"},{"type":"function","title":"LightningWeb.Endpoint.static_url/0","doc":"Generates the static URL without any path information.\n\nIt uses the configuration under `:static_url` to generate\nsuch. It falls back to `:url` if `:static_url` is not set.","ref":"LightningWeb.Endpoint.html#static_url/0"},{"type":"function","title":"LightningWeb.Endpoint.struct_url/0","doc":"Generates the endpoint base URL but as a `URI` struct.\n\nIt uses the configuration under `:url` to generate such.\nUseful for manipulating the URL data and passing it to\nURL helpers.","ref":"LightningWeb.Endpoint.html#struct_url/0"},{"type":"function","title":"LightningWeb.Endpoint.subscribe/2","doc":"","ref":"LightningWeb.Endpoint.html#subscribe/2"},{"type":"function","title":"LightningWeb.Endpoint.unsubscribe/1","doc":"","ref":"LightningWeb.Endpoint.html#unsubscribe/1"},{"type":"function","title":"LightningWeb.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"LightningWeb.Endpoint.html#url/0"},{"type":"module","title":"LightningWeb.ErrorView","doc":"","ref":"LightningWeb.ErrorView.html"},{"type":"function","title":"LightningWeb.ErrorView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.ErrorView.html#__resource__/0"},{"type":"function","title":"LightningWeb.ErrorView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.ErrorView.html#render/2"},{"type":"function","title":"LightningWeb.ErrorView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"LightningWeb.ErrorView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.FallbackController","doc":"Translates controller action results into valid `Plug.Conn` responses.\n\nSee `Phoenix.Controller.action_fallback/1` for more details.","ref":"LightningWeb.FallbackController.html"},{"type":"module","title":"LightningWeb.FirstSetupLive.Superuser","doc":"Superuser setup liveview\n\nAllows the creation on the first user in the system.\n\nIt has only one action: `:show`","ref":"LightningWeb.FirstSetupLive.Superuser.html"},{"type":"function","title":"LightningWeb.FirstSetupLive.Superuser.render/1","doc":"","ref":"LightningWeb.FirstSetupLive.Superuser.html#render/1"},{"type":"module","title":"LightningWeb.FormHelpers","doc":"Conveniences for building forms.","ref":"LightningWeb.FormHelpers.html"},{"type":"module","title":"LightningWeb.Gettext","doc":"A module providing Internationalization with a gettext-based API.\n\nBy using [Gettext](https://hexdocs.pm/gettext),\nyour module gains a set of macros for translations, for example:\n\n import LightningWeb.Gettext\n\n # Simple translation\n gettext(\"Here is the string to translate\")\n\n # Plural translation\n ngettext(\"Here is the string to translate\",\n \"Here are the strings to translate\",\n 3)\n\n # Domain-based translation\n dgettext(\"errors\", \"Here is the error message to translate\")\n\nSee the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.","ref":"LightningWeb.Gettext.html"},{"type":"macro","title":"LightningWeb.Gettext.dgettext/3","doc":"","ref":"LightningWeb.Gettext.html#dgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.dgettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#dgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.dngettext/5","doc":"","ref":"LightningWeb.Gettext.html#dngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.dngettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#dngettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext/4","doc":"","ref":"LightningWeb.Gettext.html#dpgettext/4"},{"type":"macro","title":"LightningWeb.Gettext.dpgettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#dpgettext_noop/3"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext/6","doc":"","ref":"LightningWeb.Gettext.html#dpngettext/6"},{"type":"macro","title":"LightningWeb.Gettext.dpngettext_noop/4","doc":"","ref":"LightningWeb.Gettext.html#dpngettext_noop/4"},{"type":"macro","title":"LightningWeb.Gettext.gettext/2","doc":"","ref":"LightningWeb.Gettext.html#gettext/2"},{"type":"macro","title":"LightningWeb.Gettext.gettext_comment/1","doc":"","ref":"LightningWeb.Gettext.html#gettext_comment/1"},{"type":"macro","title":"LightningWeb.Gettext.gettext_noop/1","doc":"","ref":"LightningWeb.Gettext.html#gettext_noop/1"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_bindings/2","doc":"","ref":"LightningWeb.Gettext.html#handle_missing_bindings/2"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_plural_translation/7","doc":"","ref":"LightningWeb.Gettext.html#handle_missing_plural_translation/7"},{"type":"function","title":"LightningWeb.Gettext.handle_missing_translation/5","doc":"","ref":"LightningWeb.Gettext.html#handle_missing_translation/5"},{"type":"function","title":"LightningWeb.Gettext.lgettext/5","doc":"","ref":"LightningWeb.Gettext.html#lgettext/5"},{"type":"function","title":"LightningWeb.Gettext.lngettext/7","doc":"","ref":"LightningWeb.Gettext.html#lngettext/7"},{"type":"macro","title":"LightningWeb.Gettext.ngettext/4","doc":"","ref":"LightningWeb.Gettext.html#ngettext/4"},{"type":"macro","title":"LightningWeb.Gettext.ngettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#ngettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pgettext/3","doc":"","ref":"LightningWeb.Gettext.html#pgettext/3"},{"type":"macro","title":"LightningWeb.Gettext.pgettext_noop/2","doc":"","ref":"LightningWeb.Gettext.html#pgettext_noop/2"},{"type":"macro","title":"LightningWeb.Gettext.pngettext/5","doc":"","ref":"LightningWeb.Gettext.html#pngettext/5"},{"type":"macro","title":"LightningWeb.Gettext.pngettext_noop/3","doc":"","ref":"LightningWeb.Gettext.html#pngettext_noop/3"},{"type":"module","title":"LightningWeb.HealthCheck","doc":"","ref":"LightningWeb.HealthCheck.html"},{"type":"function","title":"LightningWeb.HealthCheck.call/2","doc":"","ref":"LightningWeb.HealthCheck.html#call/2"},{"type":"function","title":"LightningWeb.HealthCheck.init/1","doc":"","ref":"LightningWeb.HealthCheck.html#init/1"},{"type":"module","title":"LightningWeb.Hooks","doc":"LiveView Hooks","ref":"LightningWeb.Hooks.html"},{"type":"function","title":"LightningWeb.Hooks.on_mount/4","doc":"Finds and assigns a project to the socket, if a user doesn't have access\nthey are redirected and shown a 'No Access' screen via a `:nav` flash message.\n\nThere is a fallthru function, when there is no `project_id` in the params -\nthis is for liveviews that may or may not have a `project_id` depending on\nusage - like `DashboardLive`.","ref":"LightningWeb.Hooks.html#on_mount/4"},{"type":"module","title":"LightningWeb.InitAssigns","doc":"Ensures common `assigns` are applied to all LiveViews attaching this hook.","ref":"LightningWeb.InitAssigns.html"},{"type":"function","title":"LightningWeb.InitAssigns.on_mount/4","doc":"","ref":"LightningWeb.InitAssigns.html#on_mount/4"},{"type":"module","title":"LightningWeb.JobLive.AdaptorPicker","doc":"Component allowing selecting an adaptor and it's version","ref":"LightningWeb.JobLive.AdaptorPicker.html"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.display_name_for_adaptor/1","doc":"Converts standard adaptor names into \"label\",\"value\" lists and returns\nnon-standard names as merely \"value\"; both can be passed directly into a\nselect option list.","ref":"LightningWeb.JobLive.AdaptorPicker.html#display_name_for_adaptor/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.get_adaptor_version_options/1","doc":"","ref":"LightningWeb.JobLive.AdaptorPicker.html#get_adaptor_version_options/1"},{"type":"function","title":"LightningWeb.JobLive.AdaptorPicker.render/1","doc":"","ref":"LightningWeb.JobLive.AdaptorPicker.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.AdaptorPicker.render/1","doc":"* `form` (`:map`) (required)\n* `on_change` (`:any`) - Defaults to `nil`.\n* `disabled` (`:boolean`) - Defaults to `false`.","ref":"LightningWeb.JobLive.AdaptorPicker.html#render/1-attributes"},{"type":"module","title":"LightningWeb.JobLive.CredentialPicker","doc":"Component allowing selecting a credential or creating a new one via a\nmodal.","ref":"LightningWeb.JobLive.CredentialPicker.html"},{"type":"function","title":"LightningWeb.JobLive.CredentialPicker.render/1","doc":"","ref":"LightningWeb.JobLive.CredentialPicker.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.CredentialPicker.render/1","doc":"* `form` (`:map`) (required)\n* `disabled` (`:boolean`) - Defaults to `false`.\n* `credentials` (`:list`) (required)\n* `on_change` (`:any`) - Defaults to `nil`.","ref":"LightningWeb.JobLive.CredentialPicker.html#render/1-attributes"},{"type":"module","title":"LightningWeb.JobLive.CronSetupComponent","doc":"A live component for managing cron setup in a form.\n\nThe `CronSetupComponent` provides an interactive form for configuring cron settings. It includes fields for specifying the frequency, minute, hour, weekday, monthday, and cron expression.","ref":"LightningWeb.JobLive.CronSetupComponent.html"},{"type":"module","title":"Usage - LightningWeb.JobLive.CronSetupComponent","doc":"1. Include the `CronSetupComponent` in your live view or template.\n2. Pass the necessary assigns to the component, such as `form`, `on_change`, and `disabled`.\n3. Handle the `cron_expression_change` event to capture changes in the form inputs.\n4. Use the updated `cron_expression` in your application logic.","ref":"LightningWeb.JobLive.CronSetupComponent.html#module-usage"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.build_cron_expression/2","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#build_cron_expression/2"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.frequency_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#frequency_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.get_cron_data/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#get_cron_data/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.hour_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#hour_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.minute_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#minute_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.monthday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#monthday_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.render/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.CronSetupComponent.render/1","doc":"* `id` (`:string`) (required)\n* `form` (`:map`) (required)\n* `on_change` (`:any`) (required)\n* `disabled` (`:boolean`) (required)","ref":"LightningWeb.JobLive.CronSetupComponent.html#render/1-attributes"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.time_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#time_field/1"},{"type":"function","title":"LightningWeb.JobLive.CronSetupComponent.weekday_field/1","doc":"","ref":"LightningWeb.JobLive.CronSetupComponent.html#weekday_field/1"},{"type":"module","title":"LightningWeb.JobLive.JobBuilderComponents","doc":"","ref":"LightningWeb.JobLive.JobBuilderComponents.html"},{"type":"function","title":"LightningWeb.JobLive.JobBuilderComponents.job_editor_component/1","doc":"","ref":"LightningWeb.JobLive.JobBuilderComponents.html#job_editor_component/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.JobBuilderComponents.job_editor_component/1","doc":"* `adaptor` (`:string`) (required)\n* `change_event` (`:string`) - Defaults to `\"job_body_changed\"`.\n* `disabled` (`:boolean`) - Defaults to `false`.\n* `disabled_message` (`:string`) (required)\n* `job_id` (`:string`) (required)\n* `source` (`:string`) (required)\n* Global attributes are accepted.","ref":"LightningWeb.JobLive.JobBuilderComponents.html#job_editor_component/1-attributes"},{"type":"module","title":"LightningWeb.JobLive.KafkaSetupComponent","doc":"","ref":"LightningWeb.JobLive.KafkaSetupComponent.html"},{"type":"function","title":"LightningWeb.JobLive.KafkaSetupComponent.render/1","doc":"","ref":"LightningWeb.JobLive.KafkaSetupComponent.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.JobLive.KafkaSetupComponent.render/1","doc":"* `id` (`:string`) (required)\n* `form` (`:map`) (required)\n* `disabled` (`:boolean`) (required)","ref":"LightningWeb.JobLive.KafkaSetupComponent.html#render/1-attributes"},{"type":"module","title":"LightningWeb.LiveHelpers","doc":"General purpose LiveView helper functions","ref":"LightningWeb.LiveHelpers.html"},{"type":"function","title":"LightningWeb.LiveHelpers.check_limits/2","doc":"","ref":"LightningWeb.LiveHelpers.html#check_limits/2"},{"type":"function","title":"LightningWeb.LiveHelpers.display_short_uuid/1","doc":"","ref":"LightningWeb.LiveHelpers.html#display_short_uuid/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_in/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_in/1"},{"type":"function","title":"LightningWeb.LiveHelpers.fade_out/1","doc":"","ref":"LightningWeb.LiveHelpers.html#fade_out/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_error_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_error_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_info_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_info_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.live_nav_block/1","doc":"","ref":"LightningWeb.LiveHelpers.html#live_nav_block/1"},{"type":"function","title":"LightningWeb.LiveHelpers.upcase_first/1","doc":"","ref":"LightningWeb.LiveHelpers.html#upcase_first/1"},{"type":"module","title":"LightningWeb.ModalPortal","doc":"Component for rendering content inside layout without full DOM patch.","ref":"LightningWeb.ModalPortal.html"},{"type":"function","title":"LightningWeb.ModalPortal.close_modal/0","doc":"","ref":"LightningWeb.ModalPortal.html#close_modal/0"},{"type":"function","title":"LightningWeb.ModalPortal.handle_event/3","doc":"","ref":"LightningWeb.ModalPortal.html#handle_event/3"},{"type":"function","title":"LightningWeb.ModalPortal.on_hide/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_hide/2"},{"type":"function","title":"LightningWeb.ModalPortal.on_show/2","doc":"","ref":"LightningWeb.ModalPortal.html#on_show/2"},{"type":"function","title":"LightningWeb.ModalPortal.open_modal/2","doc":"","ref":"LightningWeb.ModalPortal.html#open_modal/2"},{"type":"function","title":"LightningWeb.ModalPortal.render/1","doc":"","ref":"LightningWeb.ModalPortal.html#render/1"},{"type":"function","title":"LightningWeb.ModalPortal.update/2","doc":"","ref":"LightningWeb.ModalPortal.html#update/2"},{"type":"module","title":"LightningWeb.OauthController","doc":"","ref":"LightningWeb.OauthController.html"},{"type":"function","title":"LightningWeb.OauthController.new/2","doc":"","ref":"LightningWeb.OauthController.html#new/2"},{"type":"module","title":"LightningWeb.OauthCredentialHelper","doc":"A set of helper functions to encodes state and coordinate OAuth callbacks\nback to a LiveView component.","ref":"LightningWeb.OauthCredentialHelper.html"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast/2","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#broadcast/2"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.broadcast_forward/3","doc":"Broadcast a message specifically for forwarding a message to a component.\nIt expects a `subscription_id`, the module of the component and `opts`\nbeing a keyword list containing an `:id` key of the specific component.\n\nSee: `Phoenix.LiveView.send_update/3` for more info.\n\nA corresponding LiveView (that is subscribed) is expected to have a matching\n`handle_info/2` that looks like this:\n\n```\ndef handle_info({:forward, mod, opts}, socket) do\n send_update(mod, opts)\n {:noreply, socket}\nend\n```","ref":"LightningWeb.OauthCredentialHelper.html#broadcast_forward/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.build_state/3","doc":"Encode and encrypt the callback data which will be sent so a provider\nas the `state` key in the request.\n\nThe values are:\n\n- `subscription_id`\n The same ID used to subscribe.\n- The component module\n The LiveView component that is going to receive update\n- The component id\n The ID of the component","ref":"LightningWeb.OauthCredentialHelper.html#build_state/3"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.decode_state/1","doc":"","ref":"LightningWeb.OauthCredentialHelper.html#decode_state/1"},{"type":"function","title":"LightningWeb.OauthCredentialHelper.subscribe/1","doc":"Subscribe to the `oauth_credential` topic.\nIt expects the a unique ID for the topic, usually the LiveView's `socket.id`.","ref":"LightningWeb.OauthCredentialHelper.html#subscribe/1"},{"type":"module","title":"LightningWeb.OidcController","doc":"","ref":"LightningWeb.OidcController.html"},{"type":"function","title":"LightningWeb.OidcController.new/2","doc":"Once the user has completed the authorization flow from above, they are\nreturned here, and the authorization code is used to log them in.","ref":"LightningWeb.OidcController.html#new/2"},{"type":"function","title":"LightningWeb.OidcController.show/2","doc":"Given a known provider, redirect them to the authorize url on the provider","ref":"LightningWeb.OidcController.html#show/2"},{"type":"module","title":"LightningWeb.PageView","doc":"","ref":"LightningWeb.PageView.html"},{"type":"function","title":"LightningWeb.PageView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"LightningWeb.PageView.html#__resource__/0"},{"type":"function","title":"LightningWeb.PageView.render/2","doc":"Renders the given template locally.","ref":"LightningWeb.PageView.html#render/2"},{"type":"function","title":"LightningWeb.PageView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"LightningWeb.PageView.html#template_not_found/2"},{"type":"module","title":"LightningWeb.Pagination","doc":"Pagination Components\n\nThis has been extracted and adapted from `scrivener_html`.\nSee: https://github.com/mgwidmann/scrivener_html","ref":"LightningWeb.Pagination.html"},{"type":"function","title":"LightningWeb.Pagination.page_link/1","doc":"","ref":"LightningWeb.Pagination.html#page_link/1"},{"type":"function","title":"LightningWeb.Pagination.pagination_bar/1","doc":"","ref":"LightningWeb.Pagination.html#pagination_bar/1"},{"type":"function","title":"Attributes - LightningWeb.Pagination.pagination_bar/1","doc":"* `async_page` (`Phoenix.LiveView.AsyncResult`) - Defaults to `nil`.\n* `page` (`:map`) (required)\n* `url` (`:any`) (required)\n* `help_text` (`:string`) - Defaults to `nil`.","ref":"LightningWeb.Pagination.html#pagination_bar/1-attributes"},{"type":"function","title":"Slots - LightningWeb.Pagination.pagination_bar/1","doc":"* `action`","ref":"LightningWeb.Pagination.html#pagination_bar/1-slots"},{"type":"function","title":"LightningWeb.Pagination.raw_pagination_links/2","doc":"Returns the raw data in order to generate the proper HTML for pagination links. Data\nis returned in a `{text, page_number}` format where `text` is intended to be the text\nof the link and `page_number` is the page it should go to. Defaults are already supplied\nand they are as follows:\n [distance: 5, next: :next, previous: :previous, first: true, last: true, ellipsis: :ellipsis]\n`distance` must be a positive non-zero integer or an exception is raised. `next` and `previous` should be\nstrings but can be anything you want as long as it is truthy, falsey values will remove\nthem from the output. `first` and `last` are only booleans, and they just include/remove\ntheir respective link from output. An example of the data returned:\n iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 10, page_number: 5})\n [{\" >\", 6}]\n iex> Scrivener.HTML.raw_pagination_links(%{total_pages: 20, page_number: 10}, first: [\"←\"], last: [\"→\"])\n [{\" >\", 11}]\nSimply loop and pattern match over each item and transform it to your custom HTML.","ref":"LightningWeb.Pagination.html#raw_pagination_links/2"},{"type":"module","title":"LightningWeb.PlugConfigs","doc":"Dynamically initialize Plugs that don't accept dynamic configs in :prod ENV.","ref":"LightningWeb.PlugConfigs.html"},{"type":"function","title":"LightningWeb.PlugConfigs.plug_parsers/0","doc":"","ref":"LightningWeb.PlugConfigs.html#plug_parsers/0"},{"type":"module","title":"LightningWeb.Plugs.BlockRoutes","doc":"Plug to conditionally block specified routes based on configuration flags and custom messages.","ref":"LightningWeb.Plugs.BlockRoutes.html"},{"type":"module","title":"LightningWeb.Plugs.FirstSetup","doc":"Plug to redirect HTTP requests to `/first_setup` if there are no\nsuperusers in the system yet.","ref":"LightningWeb.Plugs.FirstSetup.html"},{"type":"module","title":"LightningWeb.Plugs.Redirect","doc":"A plug for redirecting requests to a specified URL.\n\nThis plug takes an option `:to` which specifies the target URL for the redirection.","ref":"LightningWeb.Plugs.Redirect.html"},{"type":"function","title":"LightningWeb.Plugs.Redirect.call/2","doc":"Redirects the connection to the specified URL.","ref":"LightningWeb.Plugs.Redirect.html#call/2"},{"type":"function","title":"Parameters - LightningWeb.Plugs.Redirect.call/2","doc":"- conn: The connection struct.\n - opts: A keyword list of options. Must include `:to` key specifying the target URL.","ref":"LightningWeb.Plugs.Redirect.html#call/2-parameters"},{"type":"function","title":"Examples - LightningWeb.Plugs.Redirect.call/2","doc":"iex> conn = %Plug.Conn{}\n iex> opts = [to: \"/new_path\"]\n iex> LightningWeb.Plugs.Redirect.call(conn, opts)\n %Plug.Conn{...}","ref":"LightningWeb.Plugs.Redirect.html#call/2-examples"},{"type":"function","title":"Raises - LightningWeb.Plugs.Redirect.call/2","doc":"`KeyError` if the `:to` key is not present in options.","ref":"LightningWeb.Plugs.Redirect.html#call/2-raises"},{"type":"function","title":"LightningWeb.Plugs.Redirect.init/1","doc":"Initializes the plug options.","ref":"LightningWeb.Plugs.Redirect.html#init/1"},{"type":"function","title":"Parameters - LightningWeb.Plugs.Redirect.init/1","doc":"- opts: A keyword list of options.","ref":"LightningWeb.Plugs.Redirect.html#init/1-parameters"},{"type":"function","title":"Returns - LightningWeb.Plugs.Redirect.init/1","doc":"The provided options are returned as they are.","ref":"LightningWeb.Plugs.Redirect.html#init/1-returns"},{"type":"function","title":"Examples - LightningWeb.Plugs.Redirect.init/1","doc":"iex> LightningWeb.Plugs.Redirect.init(to: \"/new_path\")\n [to: \"/new_path\"]","ref":"LightningWeb.Plugs.Redirect.html#init/1-examples"},{"type":"module","title":"LightningWeb.Plugs.WebhookAuth","doc":"A Plug to authenticate and authorize requests based on paths starting with '/i/'.\nIt verifies the presence of correct API keys or Basic Authentication credentials.","ref":"LightningWeb.Plugs.WebhookAuth.html"},{"type":"function","title":"LightningWeb.Plugs.WebhookAuth.call/2","doc":"Handles the incoming HTTP request and performs authentication and authorization checks\nbased on paths starting with `/i/`.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2"},{"type":"function","title":"Details - LightningWeb.Plugs.WebhookAuth.call/2","doc":"This function is the entry point for the `WebhookAuth` plug. It first checks if\nthe request path starts with `/i/` to determine whether the request should be processed\nby this plug.\n\nIf the path matches, it then extracts the `webhook` part from the request path and\nruns to fetch the corresponding `trigger` using the `fetch_trigger` function.\n\nIf a valid `trigger` is found, the function proceeds to validate the authentication\nof the request using the `validate_auth` function.\n\nIn case the `trigger` is not found, or the path does not start with `/i/`, the function\nreturns a 404 Not Found response with a JSON error message indicating that the webhook\nis not found.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-details"},{"type":"function","title":"Parameters - LightningWeb.Plugs.WebhookAuth.call/2","doc":"- `conn`: The connection struct representing the incoming HTTP request.\n- `_opts`: A set of options, not used in this function but is a mandatory parameter as per\n Plug specification.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-parameters"},{"type":"function","title":"Returns - LightningWeb.Plugs.WebhookAuth.call/2","doc":"- A connection struct representing the outgoing response, which can be a successful\n response, an unauthorized response, or a not found response, based on the evaluation\n of the above-mentioned conditions.","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-returns"},{"type":"function","title":"Examples - LightningWeb.Plugs.WebhookAuth.call/2","doc":"Assuming a request with the path `/i/some_webhook`:\n\n#","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-examples"},{"type":"function","title":"Webhook Found and Authenticated - LightningWeb.Plugs.WebhookAuth.call/2","doc":"iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])\n %Plug.Conn{status: 200, ...}\n\n iex> LightningWeb.Plugs.WebhookAuth.call(conn, [])\n %Plug.Conn{status: 404, ...}","ref":"LightningWeb.Plugs.WebhookAuth.html#call/2-webhook-found-and-authenticated"},{"type":"function","title":"LightningWeb.Plugs.WebhookAuth.init/1","doc":"Initializes the options.","ref":"LightningWeb.Plugs.WebhookAuth.html#init/1"},{"type":"module","title":"LightningWeb.ProfileLive.Edit","doc":"LiveView for user profile page.","ref":"LightningWeb.ProfileLive.Edit.html"},{"type":"function","title":"LightningWeb.ProfileLive.Edit.render/1","doc":"","ref":"LightningWeb.ProfileLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.FormComponent","doc":"Form component update profile email and password","ref":"LightningWeb.ProfileLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.FormComponent.enum_options/2","doc":"","ref":"LightningWeb.ProfileLive.FormComponent.html#enum_options/2"},{"type":"function","title":"LightningWeb.ProfileLive.FormComponent.render/1","doc":"","ref":"LightningWeb.ProfileLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProfileLive.MfaComponent","doc":"Component to enable MFA on a User's account","ref":"LightningWeb.ProfileLive.MfaComponent.html"},{"type":"function","title":"LightningWeb.ProfileLive.MfaComponent.render/1","doc":"","ref":"LightningWeb.ProfileLive.MfaComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectFileController","doc":"","ref":"LightningWeb.ProjectFileController.html"},{"type":"function","title":"LightningWeb.ProjectFileController.download/2","doc":"","ref":"LightningWeb.ProjectFileController.html#download/2"},{"type":"module","title":"LightningWeb.ProjectLive.Collaborators","doc":"This schema is used for building the changeset for adding new collaborators to a project.\nIt is mirroring the `Project -> ProjectUser` relationship.","ref":"LightningWeb.ProjectLive.Collaborators.html"},{"type":"function","title":"LightningWeb.ProjectLive.Collaborators.changeset/2","doc":"","ref":"LightningWeb.ProjectLive.Collaborators.html#changeset/2"},{"type":"function","title":"LightningWeb.ProjectLive.Collaborators.prepare_for_insertion/3","doc":"","ref":"LightningWeb.ProjectLive.Collaborators.html#prepare_for_insertion/3"},{"type":"module","title":"LightningWeb.ProjectLive.Collaborators.Collaborator","doc":"","ref":"LightningWeb.ProjectLive.Collaborators.Collaborator.html"},{"type":"module","title":"LightningWeb.ProjectLive.FormComponent","doc":"Form Component for working with a single Job\n\nA Job's `adaptor` field is a combination of the module name and the version.\nIt's formatted as an NPM style string.\n\nThe form allows the user to select a module by name and then it's version,\nwhile the version dropdown itself references `adaptor` directly.\n\nMeaning the `adaptor_name` dropdown and assigns value is not persisted.","ref":"LightningWeb.ProjectLive.FormComponent.html"},{"type":"function","title":"LightningWeb.ProjectLive.FormComponent.render/1","doc":"","ref":"LightningWeb.ProjectLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Index","doc":"LiveView for listing and managing Projects","ref":"LightningWeb.ProjectLive.Index.html"},{"type":"function","title":"LightningWeb.ProjectLive.Index.delete_action/1","doc":"","ref":"LightningWeb.ProjectLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.ProjectLive.Index.render/1","doc":"","ref":"LightningWeb.ProjectLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.InvitedCollaborators","doc":"This schema is used for building the changeset for adding new collaborators to a project.\nIt is mirroring the `Project -> ProjectUser` relationship.","ref":"LightningWeb.ProjectLive.InvitedCollaborators.html"},{"type":"function","title":"LightningWeb.ProjectLive.InvitedCollaborators.changeset/2","doc":"","ref":"LightningWeb.ProjectLive.InvitedCollaborators.html#changeset/2"},{"type":"function","title":"LightningWeb.ProjectLive.InvitedCollaborators.validate_collaborators/2","doc":"","ref":"LightningWeb.ProjectLive.InvitedCollaborators.html#validate_collaborators/2"},{"type":"module","title":"LightningWeb.ProjectLive.InvitedCollaborators.InvitedCollaborator","doc":"","ref":"LightningWeb.ProjectLive.InvitedCollaborators.InvitedCollaborator.html"},{"type":"module","title":"LightningWeb.ProjectLive.MFARequired","doc":"Liveview for project access denied error messages","ref":"LightningWeb.ProjectLive.MFARequired.html"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.on_mount/4","doc":"","ref":"LightningWeb.ProjectLive.MFARequired.html#on_mount/4"},{"type":"function","title":"LightningWeb.ProjectLive.MFARequired.render/1","doc":"","ref":"LightningWeb.ProjectLive.MFARequired.html#render/1"},{"type":"module","title":"LightningWeb.ProjectLive.Settings","doc":"Index Liveview for project settings","ref":"LightningWeb.ProjectLive.Settings.html"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.digest/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#digest/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.permissions_message/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#permissions_message/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.render/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#render/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.role/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#role/1"},{"type":"function","title":"LightningWeb.ProjectLive.Settings.user/1","doc":"","ref":"LightningWeb.ProjectLive.Settings.html#user/1"},{"type":"module","title":"LightningWeb.PromExPlugAuthorization","doc":"Implement custom authorization for PromEx metrics endpoint as per\nhttps://hexdocs.pm/prom_ex/1.1.1/PromEx.Plug.html","ref":"LightningWeb.PromExPlugAuthorization.html"},{"type":"module","title":"LightningWeb.ReAuthenticateLive.New","doc":"LiveView for re-authentication page.","ref":"LightningWeb.ReAuthenticateLive.New.html"},{"type":"function","title":"LightningWeb.ReAuthenticateLive.New.render/1","doc":"","ref":"LightningWeb.ReAuthenticateLive.New.html#render/1"},{"type":"module","title":"LightningWeb.RouteHelpers","doc":"Convenience functions for generating paths.","ref":"LightningWeb.RouteHelpers.html"},{"type":"function","title":"LightningWeb.RouteHelpers.oidc_callback_url/0","doc":"","ref":"LightningWeb.RouteHelpers.html#oidc_callback_url/0"},{"type":"function","title":"LightningWeb.RouteHelpers.project_dashboard_url/1","doc":"","ref":"LightningWeb.RouteHelpers.html#project_dashboard_url/1"},{"type":"function","title":"LightningWeb.RouteHelpers.show_run_url/2","doc":"","ref":"LightningWeb.RouteHelpers.html#show_run_url/2"},{"type":"module","title":"LightningWeb.Router","doc":"The router for Lightning.","ref":"LightningWeb.Router.html"},{"type":"function","title":"LightningWeb.Router.api/2","doc":"","ref":"LightningWeb.Router.html#api/2"},{"type":"function","title":"LightningWeb.Router.browser/2","doc":"","ref":"LightningWeb.Router.html#browser/2"},{"type":"function","title":"LightningWeb.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"LightningWeb.Router.html#call/2"},{"type":"function","title":"LightningWeb.Router.init/1","doc":"Callback required by Plug that initializes the router\nfor serving web requests.","ref":"LightningWeb.Router.html#init/1"},{"type":"function","title":"LightningWeb.Router.storybook_assets/2","doc":"","ref":"LightningWeb.Router.html#storybook_assets/2"},{"type":"function","title":"LightningWeb.Router.storybook_browser/2","doc":"","ref":"LightningWeb.Router.html#storybook_browser/2"},{"type":"module","title":"LightningWeb.RunChannel","doc":"Phoenix channel to interact with Runs.","ref":"LightningWeb.RunChannel.html"},{"type":"function","title":"LightningWeb.RunChannel.child_spec/1","doc":"","ref":"LightningWeb.RunChannel.html#child_spec/1"},{"type":"function","title":"LightningWeb.RunChannel.handle_in/3","doc":"For the time being, calls to `fetch:dataclip` will return dataclips that are\npreformatted for use as \"initial state\" in a run.\n\nThis means that the body of http requests will be nested inside a \"data\" key.\n\nThere is an open discussion on the community that may impact how we\nstore HTTP requests in the database as dataclips and how we send the body\nof those HTTP requests to the worker to use as initial state.","ref":"LightningWeb.RunChannel.html#handle_in/3"},{"type":"function","title":"LightningWeb.RunChannel.start_link/1","doc":"","ref":"LightningWeb.RunChannel.html#start_link/1"},{"type":"module","title":"LightningWeb.RunLive.ExportConfirmationModal","doc":"","ref":"LightningWeb.RunLive.ExportConfirmationModal.html"},{"type":"module","title":"LightningWeb.RunLive.Index","doc":"Index Liveview for Runs","ref":"LightningWeb.RunLive.Index.html"},{"type":"function","title":"LightningWeb.RunLive.Index.checked?/2","doc":"Takes a changeset used for querying workorders and checks to see if the given\nfilter is present in that changeset. Returns true or false.","ref":"LightningWeb.RunLive.Index.html#checked?/2"},{"type":"function","title":"LightningWeb.RunLive.Index.filters_changeset/1","doc":"Creates a changeset based on given parameters and the fixed workorder filter types.","ref":"LightningWeb.RunLive.Index.html#filters_changeset/1"},{"type":"function","title":"LightningWeb.RunLive.Index.handle_info/2","doc":"When a WorkOrderCreated event is detected, we first check to see if the new\nwork order is admissible on the page, given the current filters. If it is, we\nadd it to the top of the page. If not, nothing happens.","ref":"LightningWeb.RunLive.Index.html#handle_info/2"},{"type":"function","title":"LightningWeb.RunLive.Index.render/1","doc":"","ref":"LightningWeb.RunLive.Index.html#render/1"},{"type":"function","title":"LightningWeb.RunLive.Index.validate_bulk_rerun/2","doc":"","ref":"LightningWeb.RunLive.Index.html#validate_bulk_rerun/2"},{"type":"module","title":"LightningWeb.RunLive.RerunJobComponent","doc":"Rerun job component","ref":"LightningWeb.RunLive.RerunJobComponent.html"},{"type":"module","title":"LightningWeb.RunLive.RunViewerLive","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html"},{"type":"function","title":"LightningWeb.RunLive.RunViewerLive.apply_selected_step_id/2","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html#apply_selected_step_id/2"},{"type":"function","title":"LightningWeb.RunLive.RunViewerLive.handle_steps_change/1","doc":"","ref":"LightningWeb.RunLive.RunViewerLive.html#handle_steps_change/1"},{"type":"module","title":"LightningWeb.RunLive.Show","doc":"","ref":"LightningWeb.RunLive.Show.html"},{"type":"function","title":"LightningWeb.RunLive.Show.apply_selected_step_id/2","doc":"","ref":"LightningWeb.RunLive.Show.html#apply_selected_step_id/2"},{"type":"function","title":"LightningWeb.RunLive.Show.handle_steps_change/1","doc":"","ref":"LightningWeb.RunLive.Show.html#handle_steps_change/1"},{"type":"module","title":"LightningWeb.RunLive.Streaming","doc":"","ref":"LightningWeb.RunLive.Streaming.html"},{"type":"function","title":"LightningWeb.RunLive.Streaming.add_or_update_step/2","doc":"","ref":"LightningWeb.RunLive.Streaming.html#add_or_update_step/2"},{"type":"function","title":"LightningWeb.RunLive.Streaming.get_dataclip/2","doc":"","ref":"LightningWeb.RunLive.Streaming.html#get_dataclip/2"},{"type":"function","title":"LightningWeb.RunLive.Streaming.get_run_async/2","doc":"Starts an async process that will fetch the run with the given ID.","ref":"LightningWeb.RunLive.Streaming.html#get_run_async/2"},{"type":"function","title":"LightningWeb.RunLive.Streaming.maybe_load_input_dataclip/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#maybe_load_input_dataclip/1"},{"type":"function","title":"LightningWeb.RunLive.Streaming.maybe_load_output_dataclip/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#maybe_load_output_dataclip/1"},{"type":"function","title":"LightningWeb.RunLive.Streaming.sort_steps/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#sort_steps/1"},{"type":"function","title":"LightningWeb.RunLive.Streaming.unselect_step/1","doc":"","ref":"LightningWeb.RunLive.Streaming.html#unselect_step/1"},{"type":"module","title":"LightningWeb.RunLive.WorkOrderComponent","doc":"Work Order component","ref":"LightningWeb.RunLive.WorkOrderComponent.html"},{"type":"function","title":"LightningWeb.RunLive.WorkOrderComponent.render/1","doc":"","ref":"LightningWeb.RunLive.WorkOrderComponent.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.RunLive.WorkOrderComponent.render/1","doc":"* `show_details` (`:boolean`) - Defaults to `false`.\n* `show_prev_runs` (`:boolean`) - Defaults to `false`.\n* `entry_selected` (`:boolean`) - Defaults to `false`.","ref":"LightningWeb.RunLive.WorkOrderComponent.html#render/1-attributes"},{"type":"module","title":"LightningWeb.Telemetry","doc":"Assorted metrics to collect during runtime.\n\nSee https://hexdocs.pm/phoenix/telemetry.html","ref":"LightningWeb.Telemetry.html"},{"type":"function","title":"LightningWeb.Telemetry.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"LightningWeb.Telemetry.html#child_spec/1"},{"type":"function","title":"LightningWeb.Telemetry.metrics/0","doc":"","ref":"LightningWeb.Telemetry.html#metrics/0"},{"type":"function","title":"LightningWeb.Telemetry.start_link/1","doc":"","ref":"LightningWeb.Telemetry.html#start_link/1"},{"type":"function","title":"LightningWeb.Telemetry.with_span/3","doc":"Convenience function that wraps `:telemetry.span/3`.\n\nGiven a function with an arity of zero, it passes the `metadata` argument\nout with the result of the function.\n\nIf you need to control the `metadata`, pass in a function with an arity of\none. It will be called with the metadata provided and expects the result and\nthe updated metadata to be returned in a tuple.\n\nExample:\n\n with_span([:my, span], %{project_id: 123}, fn -> get_project(456) end)\n\nOr when you want to extend the metadata:\n\n with_span([:my, :span], %{user_id: 123}, fn _metadata ->\n project = get_project(456)\n {project, %{project_id: project.id}}\n end)","ref":"LightningWeb.Telemetry.html#with_span/3"},{"type":"module","title":"LightningWeb.TokensLive.Index","doc":"LiveView for listing and managing tokens","ref":"LightningWeb.TokensLive.Index.html"},{"type":"function","title":"LightningWeb.TokensLive.Index.render/1","doc":"","ref":"LightningWeb.TokensLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserAuth","doc":"The UserAuth controller.","ref":"LightningWeb.UserAuth.html"},{"type":"function","title":"LightningWeb.UserAuth.authenticate_bearer/2","doc":"","ref":"LightningWeb.UserAuth.html#authenticate_bearer/2"},{"type":"function","title":"LightningWeb.UserAuth.fetch_current_user/2","doc":"Authenticates the user by looking into the session\nand remember me token.","ref":"LightningWeb.UserAuth.html#fetch_current_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_in_user/2","doc":"Logs the user in by creating a new session token.","ref":"LightningWeb.UserAuth.html#log_in_user/2"},{"type":"function","title":"LightningWeb.UserAuth.log_out_user/1","doc":"Logs the user out.\n\nIt clears all session data for safety. See renew_session.","ref":"LightningWeb.UserAuth.html#log_out_user/1"},{"type":"function","title":"LightningWeb.UserAuth.mark_totp_pending/1","doc":"","ref":"LightningWeb.UserAuth.html#mark_totp_pending/1"},{"type":"function","title":"LightningWeb.UserAuth.new_session/2","doc":"Assigns the token to a new session.\n\nIt renews the session ID and clears the whole session\nto avoid fixation attacks. See the renew_session\nfunction to customize this behaviour.\n\nIt also sets a `:live_socket_id` key in the session,\nso LiveView sessions are identified and automatically\ndisconnected on log out. The line can be safely removed\nif you are not using LiveView.","ref":"LightningWeb.UserAuth.html#new_session/2"},{"type":"function","title":"LightningWeb.UserAuth.on_mount/4","doc":"Used for LiveView routes that require the user to be reauthenticated.","ref":"LightningWeb.UserAuth.html#on_mount/4"},{"type":"function","title":"LightningWeb.UserAuth.reauth_sudo_mode/2","doc":"Reauthenticate the user by using the sudo token","ref":"LightningWeb.UserAuth.html#reauth_sudo_mode/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_if_user_is_authenticated/2","doc":"Used for routes that require the user to not be authenticated.","ref":"LightningWeb.UserAuth.html#redirect_if_user_is_authenticated/2"},{"type":"function","title":"LightningWeb.UserAuth.redirect_with_return_to/2","doc":"Returns to or redirects to the dashboard and potentially set remember_me token.","ref":"LightningWeb.UserAuth.html#redirect_with_return_to/2"},{"type":"function","title":"LightningWeb.UserAuth.require_authenticated_api_resource/2","doc":"Used for API routes that require the resource to be authenticated.\nA resource can be a `User` or a `ProjectRepoConnection`","ref":"LightningWeb.UserAuth.html#require_authenticated_api_resource/2"},{"type":"function","title":"LightningWeb.UserAuth.require_authenticated_user/2","doc":"Used for routes that require the user to be authenticated.\n\nIf you want to enforce the user email is confirmed before\nthey use the application at all, here would be a good place.","ref":"LightningWeb.UserAuth.html#require_authenticated_user/2"},{"type":"function","title":"LightningWeb.UserAuth.require_sudo_user/2","doc":"Used for routes that require the user to be reauthenticated.","ref":"LightningWeb.UserAuth.html#require_sudo_user/2"},{"type":"function","title":"LightningWeb.UserAuth.require_superuser/2","doc":"Require that the user has the `superuser` role","ref":"LightningWeb.UserAuth.html#require_superuser/2"},{"type":"function","title":"LightningWeb.UserAuth.totp_pending?/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_pending?/1"},{"type":"function","title":"LightningWeb.UserAuth.totp_validated/1","doc":"","ref":"LightningWeb.UserAuth.html#totp_validated/1"},{"type":"module","title":"LightningWeb.UserConfirmationController","doc":"","ref":"LightningWeb.UserConfirmationController.html"},{"type":"function","title":"LightningWeb.UserConfirmationController.confirm_email/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#confirm_email/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.create/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#create/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.edit/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#edit/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.new/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#new/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.send_email/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#send_email/2"},{"type":"function","title":"LightningWeb.UserConfirmationController.update/2","doc":"","ref":"LightningWeb.UserConfirmationController.html#update/2"},{"type":"module","title":"LightningWeb.UserLive.Edit","doc":"LiveView for editing a single job, which inturn uses `LightningWeb.JobLive.BigFormComponent`\nfor common functionality.","ref":"LightningWeb.UserLive.Edit.html"},{"type":"function","title":"LightningWeb.UserLive.Edit.render/1","doc":"","ref":"LightningWeb.UserLive.Edit.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.FormComponent","doc":"Form component for creating and editing users","ref":"LightningWeb.UserLive.FormComponent.html"},{"type":"function","title":"LightningWeb.UserLive.FormComponent.render/1","doc":"","ref":"LightningWeb.UserLive.FormComponent.html#render/1"},{"type":"module","title":"LightningWeb.UserLive.Index","doc":"Index page for listing users","ref":"LightningWeb.UserLive.Index.html"},{"type":"function","title":"LightningWeb.UserLive.Index.delete_action/1","doc":"","ref":"LightningWeb.UserLive.Index.html#delete_action/1"},{"type":"function","title":"LightningWeb.UserLive.Index.render/1","doc":"","ref":"LightningWeb.UserLive.Index.html#render/1"},{"type":"module","title":"LightningWeb.UserRegistrationController","doc":"","ref":"LightningWeb.UserRegistrationController.html"},{"type":"function","title":"LightningWeb.UserRegistrationController.create/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#create/2"},{"type":"function","title":"LightningWeb.UserRegistrationController.new/2","doc":"","ref":"LightningWeb.UserRegistrationController.html#new/2"},{"type":"module","title":"LightningWeb.UserResetPasswordController","doc":"","ref":"LightningWeb.UserResetPasswordController.html"},{"type":"function","title":"LightningWeb.UserResetPasswordController.create/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#create/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.edit/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#edit/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.new/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#new/2"},{"type":"function","title":"LightningWeb.UserResetPasswordController.update/2","doc":"","ref":"LightningWeb.UserResetPasswordController.html#update/2"},{"type":"module","title":"LightningWeb.UserSessionController","doc":"","ref":"LightningWeb.UserSessionController.html"},{"type":"function","title":"LightningWeb.UserSessionController.auth_handler_url/0","doc":"","ref":"LightningWeb.UserSessionController.html#auth_handler_url/0"},{"type":"function","title":"LightningWeb.UserSessionController.create/2","doc":"","ref":"LightningWeb.UserSessionController.html#create/2"},{"type":"function","title":"LightningWeb.UserSessionController.delete/2","doc":"","ref":"LightningWeb.UserSessionController.html#delete/2"},{"type":"function","title":"LightningWeb.UserSessionController.exchange_token/2","doc":"","ref":"LightningWeb.UserSessionController.html#exchange_token/2"},{"type":"function","title":"LightningWeb.UserSessionController.new/2","doc":"","ref":"LightningWeb.UserSessionController.html#new/2"},{"type":"module","title":"LightningWeb.UserTOTPController","doc":"","ref":"LightningWeb.UserTOTPController.html"},{"type":"function","title":"LightningWeb.UserTOTPController.create/2","doc":"","ref":"LightningWeb.UserTOTPController.html#create/2"},{"type":"function","title":"LightningWeb.UserTOTPController.new/2","doc":"","ref":"LightningWeb.UserTOTPController.html#new/2"},{"type":"module","title":"LightningWeb.Utils","doc":"Helper functions to deal with forms and query params.","ref":"LightningWeb.Utils.html"},{"type":"function","title":"LightningWeb.Utils.build_params_for_field/3","doc":"","ref":"LightningWeb.Utils.html#build_params_for_field/3"},{"type":"function","title":"LightningWeb.Utils.decode_one/2","doc":"","ref":"LightningWeb.Utils.html#decode_one/2"},{"type":"module","title":"LightningWeb.VersionControlController","doc":"","ref":"LightningWeb.VersionControlController.html"},{"type":"function","title":"LightningWeb.VersionControlController.index/2","doc":"","ref":"LightningWeb.VersionControlController.html#index/2"},{"type":"module","title":"LightningWeb.WebhooksController","doc":"","ref":"LightningWeb.WebhooksController.html"},{"type":"function","title":"LightningWeb.WebhooksController.check/2","doc":"","ref":"LightningWeb.WebhooksController.html#check/2"},{"type":"function","title":"LightningWeb.WebhooksController.create/2","doc":"","ref":"LightningWeb.WebhooksController.html#create/2"},{"type":"module","title":"LightningWeb.WorkerChannel","doc":"Websocket channel to handle when workers join or claim something to run.","ref":"LightningWeb.WorkerChannel.html"},{"type":"function","title":"LightningWeb.WorkerChannel.child_spec/1","doc":"","ref":"LightningWeb.WorkerChannel.html#child_spec/1"},{"type":"function","title":"LightningWeb.WorkerChannel.start_link/1","doc":"","ref":"LightningWeb.WorkerChannel.html#start_link/1"},{"type":"module","title":"LightningWeb.WorkerSocket","doc":"","ref":"LightningWeb.WorkerSocket.html"},{"type":"function","title":"LightningWeb.WorkerSocket.handle_error/2","doc":"","ref":"LightningWeb.WorkerSocket.html#handle_error/2"},{"type":"module","title":"LightningWeb.WorkflowLive.AiAssistantComponent","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.handle_async/3","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#handle_async/3"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.handle_event/3","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#handle_event/3"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.mount/1","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#mount/1"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.render/1","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#render/1"},{"type":"function","title":"LightningWeb.WorkflowLive.AiAssistantComponent.update/2","doc":"","ref":"LightningWeb.WorkflowLive.AiAssistantComponent.html#update/2"},{"type":"module","title":"LightningWeb.WorkflowLive.EditorPane","doc":"","ref":"LightningWeb.WorkflowLive.EditorPane.html"},{"type":"function","title":"LightningWeb.WorkflowLive.EditorPane.render/1","doc":"","ref":"LightningWeb.WorkflowLive.EditorPane.html#render/1"},{"type":"function","title":"Attributes - LightningWeb.WorkflowLive.EditorPane.render/1","doc":"* `id` (`:string`) (required)\n* `disabled` (`:boolean`) - Defaults to `false`.\n* `disabled_message` (`:string`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.\n* `on_change` (`:any`) (required)\n* `adaptor` (`:string`) (required)\n* `source` (`:string`) (required)\n* `job_id` (`:string`) (required)","ref":"LightningWeb.WorkflowLive.EditorPane.html#render/1-attributes"},{"type":"module","title":"LightningWeb.WorkflowLive.Helpers","doc":"Helper functions for the Workflow LiveViews.","ref":"LightningWeb.WorkflowLive.Helpers.html"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.broadcast_updated_params/2","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#broadcast_updated_params/2"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.run_workflow/3","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#run_workflow/3"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.save_workflow/1","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#save_workflow/1"},{"type":"function","title":"LightningWeb.WorkflowLive.Helpers.subscribe_to_params_update/1","doc":"","ref":"LightningWeb.WorkflowLive.Helpers.html#subscribe_to_params_update/1"},{"type":"module","title":"LightningWeb.WorkflowLive.JobView","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.container/1","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html#container/1"},{"type":"function","title":"Attributes - LightningWeb.WorkflowLive.JobView.container/1","doc":"* `id` (`:string`) (required)","ref":"LightningWeb.WorkflowLive.JobView.html#container/1-attributes"},{"type":"function","title":"Slots - LightningWeb.WorkflowLive.JobView.container/1","doc":"* `top`\n* `inner_block`\n* `bottom`\n* `column` - Accepts attributes:\n\n * `class` (`:string`) - Extra CSS classes for the column.","ref":"LightningWeb.WorkflowLive.JobView.html#container/1-slots"},{"type":"function","title":"LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1"},{"type":"function","title":"Attributes - LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"* `job` (`:map`) (required)\n* `form` (`:map`) (required) - A form built from a job.\n* `current_user` (`:map`) (required)\n* `project` (`:map`) (required)\n* `close_url` (`:any`) (required)\n* `socket` (`:any`) (required)\n* `follow_run_id` (`:any`) - Defaults to `nil`.\n* `snapshot` (`:any`) (required)\n* `snapshot_version` (`:any`) (required)\n* `display_banner` (`:boolean`) - Defaults to `false`.\n* `banner_message` (`:string`) - Defaults to `\"\"`.\n* `presences` (`:list`) (required)\n* `prior_user_presence` (`:any`) (required)","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1-attributes"},{"type":"function","title":"Slots - LightningWeb.WorkflowLive.JobView.job_edit_view/1","doc":"* `footer`\n* `collapsible_panel` - Accepts attributes:\n\n * `id` (`:string`) (required)\n * `panel_title` (`:string`) (required)\n * `class` (`:string`) - Extra CSS classes for the column.","ref":"LightningWeb.WorkflowLive.JobView.html#job_edit_view/1-slots"},{"type":"module","title":"LightningWeb.WorkflowLive.NewWorkflowForm","doc":"","ref":"LightningWeb.WorkflowLive.NewWorkflowForm.html"},{"type":"function","title":"LightningWeb.WorkflowLive.NewWorkflowForm.validate/2","doc":"","ref":"LightningWeb.WorkflowLive.NewWorkflowForm.html#validate/2"},{"type":"function","title":"LightningWeb.WorkflowLive.NewWorkflowForm.validate_for_save/1","doc":"","ref":"LightningWeb.WorkflowLive.NewWorkflowForm.html#validate_for_save/1"},{"type":"module","title":"LightningWeb.WorkflowNewLive.WorkflowParams","doc":"Various function for reconciling changes to a workflow params map.\n\nThe front end editor uses JSON patches to represent changes to the workflow.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_form_params/2","doc":"Produce a new set of params by applying the given form params to the current\nparams.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_form_params/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.apply_patches/2","doc":"Produce a new set of params by applying the given patches to the current parms","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#apply_patches/2"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_map/1","doc":"Convert a changeset to a serializable map of workflow params, suitable for\nsending to the front end editor.\n\nIt uses `Lightning.Helpers.json_safe/1` to ensure that the map is safe to\nserialize to JSON. This is necessary because the underlying model may\ncontain atom values.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_map/1"},{"type":"function","title":"LightningWeb.WorkflowNewLive.WorkflowParams.to_patches/2","doc":"Produce a set of patches that represent the difference between the initial\nparams and the target params.\n\nThis usually is used to produce a set of patches that represent the changes\nintroduced by a changeset.","ref":"LightningWeb.WorkflowNewLive.WorkflowParams.html#to_patches/2"},{"type":"module","title":"Lightning.API","doc":"Behaviour for implementing the Lightning interface.\n\nThis behaviour is used to mock specific functions in tests.","ref":"Lightning.API.html"},{"type":"module","title":"Lightning.AdaptorRegistry","doc":"Registry process to query and maintain a list of adaptors available for\nwriting jobs.\n\nCurrently it queries NPM for all modules in the `@openfn` organization and\nfilters out modules that are known not to be adaptors.\n\n**Usage**\n\n```\n# Starting the process\nAdaptorRegistry.start_link()\n# Getting a list of all adaptors\nLightning.AdaptorRegistry.AdaptorRegistry.all()\n```\n\n**Caching**\n\nBy default the results are cached to disk, and will be reused every start.\n\nIn order to disable or configure caching pass see: `start_link/1`.\n\nThe process uses `:continue` to return before the adaptors have been queried.\nThis does mean that the first call to the process will be delayed until\nthe `handle_continue/2` has finished.\n\n**Timeouts**\n\nThere is a 'general' timeout of 30s, this is used for GenServer calls like\n`all/1` and also internally when the modules are being queried. NPM can\nbe extremely fast to respond if the package is cached on their side, but\ncan take a couple of seconds if not cached.","ref":"Lightning.AdaptorRegistry.html"},{"type":"function","title":"Lightning.AdaptorRegistry.all/1","doc":"Get the current in-process list of adaptors.\nThis call will wait behind the `:continue` message when the process starts\nup, so it may take a while the first time it is called (and the list hasn't\nbeen fetched yet).","ref":"Lightning.AdaptorRegistry.html#all/1"},{"type":"function","title":"Lightning.AdaptorRegistry.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.AdaptorRegistry.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorRegistry.fetch/0","doc":"Fetch a list of packages for the @openfn organisation","ref":"Lightning.AdaptorRegistry.html#fetch/0"},{"type":"function","title":"Lightning.AdaptorRegistry.latest_for/2","doc":"Get a latest version for a given module.","ref":"Lightning.AdaptorRegistry.html#latest_for/2"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_adaptor/1","doc":"","ref":"Lightning.AdaptorRegistry.html#resolve_adaptor/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name/1","doc":"Destructures an NPM style package name into module name and version.\n\n**Example**\n\n iex> resolve_package_name(\"@openfn/language-salesforce@1.2.3\")\n { \"@openfn/language-salesforce\", \"1.2.3\" }\n iex> resolve_package_name(\"@openfn/language-salesforce\")\n { \"@openfn/language-salesforce\", nil }","ref":"Lightning.AdaptorRegistry.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorRegistry.resolve_package_name!/1","doc":"Same as `resolve_package_name/1` except will throw an exception if a package\nname cannot be matched.","ref":"Lightning.AdaptorRegistry.html#resolve_package_name!/1"},{"type":"function","title":"Lightning.AdaptorRegistry.start_link/1","doc":"Starts the AdaptorRegistry\n\n**Options**\n\n- `:use_cache` (defaults to false) - stores the last set of results on disk\n and uses the cached file for every subsequent start.\n It can either be a boolean, or a string - the latter being a file path\n to set where the cache file is located.\n- `:name` (defaults to AdaptorRegistry) - the name of the process, useful\n for testing and/or running multiple versions of the registry","ref":"Lightning.AdaptorRegistry.html#start_link/1"},{"type":"function","title":"Lightning.AdaptorRegistry.versions_for/2","doc":"Get a list of versions for a given module.","ref":"Lightning.AdaptorRegistry.html#versions_for/2"},{"type":"module","title":"Lightning.AdaptorRegistry.Npm","doc":"NPM API functions","ref":"Lightning.AdaptorRegistry.Npm.html"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete/3","doc":"Issues a DELETE request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#delete!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get/3","doc":"Issues a GET request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#get!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head/3","doc":"Issues a HEAD request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#head!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options/3","doc":"Issues an OPTIONS request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#options!/3"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.package_detail/1","doc":"Retrieve all details for an NPM package","ref":"Lightning.AdaptorRegistry.Npm.html#package_detail/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch/4","doc":"Issues a PATCH request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#patch!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post/4","doc":"Issues a POST request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#post!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_headers/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_body/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_body/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_headers/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_options/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_options/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_request_params/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_request_params/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_chunk/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_headers/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_headers/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_response_status_code/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_status_code/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_status_code/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.process_url/1","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#process_url/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put/4","doc":"Issues a PUT request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#put!/4"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/1","doc":"Issues an HTTP request using an `HTTPoison.Request` struct.\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AdaptorRegistry.Npm.html#request/1"},{"type":"function","title":"Redirect handling - Lightning.AdaptorRegistry.Npm.request/1","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AdaptorRegistry.Npm.html#request/1-redirect-handling"},{"type":"function","title":"Examples - Lightning.AdaptorRegistry.Npm.request/1","doc":"request = %HTTPoison.Request{\n method: :post,\n url: \"https://my.website.com\",\n body: \"{\\\"foo\\\": 3}\",\n headers: [{\"Accept\", \"application/json\"}]\n }\n\n request(request)","ref":"Lightning.AdaptorRegistry.Npm.html#request/1-examples"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request/5","doc":"Issues an HTTP request with the given method to the given url.\n\nThis function is usually used indirectly by `get/3`, `post/4`, `put/4`, etc\n\nArgs:\n * `method` - HTTP method as an atom (`:get`, `:head`, `:post`, `:put`,\n `:delete`, etc.)\n * `url` - target url as a binary string or char list\n * `body` - request body. See more below\n * `headers` - HTTP headers as an orddict (e.g., `[{\"Accept\", \"application/json\"}]`)\n * `options` - Keyword list of options\n\nBody: see type `HTTPoison.Request`\n\nOptions: see type `HTTPoison.Request`\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AdaptorRegistry.Npm.html#request/5"},{"type":"function","title":"Redirect handling - Lightning.AdaptorRegistry.Npm.request/5","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AdaptorRegistry.Npm.html#request/5-redirect-handling"},{"type":"function","title":"Examples - Lightning.AdaptorRegistry.Npm.request/5","doc":"request(:post, \"https://my.website.com\", \"{\\\"foo\\\": 3}\", [{\"Accept\", \"application/json\"}])","ref":"Lightning.AdaptorRegistry.Npm.html#request/5-examples"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request!/1","doc":"Issues an HTTP request an `HTTPoison.Request` struct.\nexception in case of failure.\n\n`request!/1` works exactly like `request/1` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AdaptorRegistry.Npm.html#request!/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an\nexception in case of failure.\n\n`request!/5` works exactly like `request/5` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AdaptorRegistry.Npm.html#request!/5"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AdaptorRegistry.Npm.html#start/0"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.stream_next/1","doc":"Requests the next message to be streamed for a given `HTTPoison.AsyncResponse`.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AdaptorRegistry.Npm.html#stream_next/1"},{"type":"function","title":"Lightning.AdaptorRegistry.Npm.user_packages/1","doc":"Retrieve all packages for a given user or organization. Return empty list if\napplication cannot connect to NPM. (E.g., because it's started offline.)","ref":"Lightning.AdaptorRegistry.Npm.html#user_packages/1"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.body/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:body/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.headers/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:headers/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.method/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:method/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.options/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:options/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.params/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:params/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.request/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:request/0"},{"type":"type","title":"Lightning.AdaptorRegistry.Npm.url/0","doc":"","ref":"Lightning.AdaptorRegistry.Npm.html#t:url/0"},{"type":"module","title":"Lightning.AdaptorService","doc":"The Adaptor Service is use to query and install adaptors in order to run jobs.\n\nOn startup, it queries the filesystem for `package.json` files and builds up\na list of available adaptors.","ref":"Lightning.AdaptorService.html"},{"type":"module","title":"Configuration - Lightning.AdaptorService","doc":"The service requires at least `:adaptors_path`, which is used to both query\nwhich adaptors are installed and when to install new adaptors.\n\nAnother optional setting is: `:repo`, which must point at a module that will be\nused to do the querying and installing.","ref":"Lightning.AdaptorService.html#module-configuration"},{"type":"module","title":"Installing Adaptors - Lightning.AdaptorService","doc":"Using the `install/2` function an adaptor can be installed, which will also\nadd it to the list of available adaptors.\n\nThe adaptor is marked as `:installing`, to allow for conditional behaviour\nelsewhere such as delaying or rejecting processing until the adaptor becomes\navailable.","ref":"Lightning.AdaptorService.html#module-installing-adaptors"},{"type":"module","title":"Looking up adaptors - Lightning.AdaptorService","doc":"The module leans on Elixir's built-in `Version` module to provide version\nlookups.\n\nWhen looking up an adaptor, either a string or a tuple can be used.\nIn the case of requesting the latest version, any one of these will return\nthe latest version the service is aware of.\n\n- `@openfn/language-http`\n- `@openfn/language-http@latest`\n- `{\"@openfn/language-http\", nil}`\n- `{\"@openfn/language-http\", \"latest\"}`\n- `{~r/language-http/, \"latest\"}`\n\nYou can also request a specific version, or use a range specification:\n\n- `@openfn/language-http@1.2.3`\n- `{\"@openfn/language-http\", \"~> 1.2.0\"}`\n- `{\"@openfn/language-http\", \" **NOTE**\n> More complex npm style install strings like: `\">=0.1.0 are not supported.\n> Generally the tuple style is preferred when using range specifications as\n> the npm style strings have a simplistic regex splitter.\n\nSee [Version](https://hexdocs.pm/elixir/Version.html) for more details on\nmatching versions.","ref":"Lightning.AdaptorService.html#module-looking-up-adaptors"},{"type":"function","title":"Lightning.AdaptorService.build_aliased_name/1","doc":"Turns a package name and version into a string for NPM.\n\nSince multiple versions of the same package can be installed, it's important\nto rely on npms built-in package aliasing.\n\nE.g. `@openfn/language-http@1.2.8` turns into:\n `@openfn/language-http-1.2.8@npm:@openfn/language-http@1.2.8`\n\nWhich is pretty long winded but necessary for the reason above.\n\nIf using this module as a base, it's likely you would need to adaptor this\nto suit your particular naming strategy.","ref":"Lightning.AdaptorService.html#build_aliased_name/1"},{"type":"function","title":"Lightning.AdaptorService.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.AdaptorService.html#child_spec/1"},{"type":"function","title":"Lightning.AdaptorService.find_adaptor/2","doc":"","ref":"Lightning.AdaptorService.html#find_adaptor/2"},{"type":"function","title":"Lightning.AdaptorService.get_adaptors/1","doc":"","ref":"Lightning.AdaptorService.html#get_adaptors/1"},{"type":"function","title":"Lightning.AdaptorService.install/2","doc":"","ref":"Lightning.AdaptorService.html#install/2"},{"type":"function","title":"Lightning.AdaptorService.install!/2","doc":"","ref":"Lightning.AdaptorService.html#install!/2"},{"type":"function","title":"Lightning.AdaptorService.installed?/2","doc":"","ref":"Lightning.AdaptorService.html#installed?/2"},{"type":"function","title":"Lightning.AdaptorService.resolve_package_name/1","doc":"","ref":"Lightning.AdaptorService.html#resolve_package_name/1"},{"type":"function","title":"Lightning.AdaptorService.start_link/1","doc":"","ref":"Lightning.AdaptorService.html#start_link/1"},{"type":"type","title":"Lightning.AdaptorService.package_spec/0","doc":"","ref":"Lightning.AdaptorService.html#t:package_spec/0"},{"type":"module","title":"Lightning.AiAssistant","doc":"The AI assistant module.","ref":"Lightning.AiAssistant.html"},{"type":"function","title":"Lightning.AiAssistant.available?/1","doc":"","ref":"Lightning.AiAssistant.html#available?/1"},{"type":"function","title":"Lightning.AiAssistant.create_session/3","doc":"","ref":"Lightning.AiAssistant.html#create_session/3"},{"type":"function","title":"Lightning.AiAssistant.enabled?/0","doc":"Checks if the AI assistant is enabled.","ref":"Lightning.AiAssistant.html#enabled?/0"},{"type":"function","title":"Lightning.AiAssistant.endpoint_available?/0","doc":"Checks if the Apollo endpoint is available.","ref":"Lightning.AiAssistant.html#endpoint_available?/0"},{"type":"function","title":"Lightning.AiAssistant.get_session!/1","doc":"","ref":"Lightning.AiAssistant.html#get_session!/1"},{"type":"function","title":"Lightning.AiAssistant.list_sessions_for_job/1","doc":"","ref":"Lightning.AiAssistant.html#list_sessions_for_job/1"},{"type":"function","title":"Lightning.AiAssistant.project_has_any_session?/1","doc":"","ref":"Lightning.AiAssistant.html#project_has_any_session?/1"},{"type":"function","title":"Lightning.AiAssistant.put_expression_and_adaptor/3","doc":"","ref":"Lightning.AiAssistant.html#put_expression_and_adaptor/3"},{"type":"function","title":"Lightning.AiAssistant.query/2","doc":"Queries the AI assistant with the given content.\n\nReturns `{:ok, session}` if the query was successful, otherwise `:error`.\n\n**Example**\n\n iex> AiAssistant.query(session, \"fn()\")\n {:ok, session}","ref":"Lightning.AiAssistant.html#query/2"},{"type":"function","title":"Lightning.AiAssistant.save_message/2","doc":"","ref":"Lightning.AiAssistant.html#save_message/2"},{"type":"module","title":"Lightning.AiAssistant.Limiter","doc":"The AI assistant limiter to check for AI query quota.","ref":"Lightning.AiAssistant.Limiter.html"},{"type":"function","title":"Lightning.AiAssistant.Limiter.validate_quota/1","doc":"Checks if has not reached the limit of the project ai queries quota.","ref":"Lightning.AiAssistant.Limiter.html#validate_quota/1"},{"type":"module","title":"Lightning.ApolloClient","doc":"Client for communicating with the Apollo service.","ref":"Lightning.ApolloClient.html"},{"type":"function","title":"Lightning.ApolloClient.query/3","doc":"","ref":"Lightning.ApolloClient.html#query/3"},{"type":"function","title":"Lightning.ApolloClient.test/0","doc":"Checks if the Apollo endpoint is available.","ref":"Lightning.ApolloClient.html#test/0"},{"type":"type","title":"Lightning.ApolloClient.context/0","doc":"","ref":"Lightning.ApolloClient.html#t:context/0"},{"type":"module","title":"Lightning.Auditing","doc":"Context for working with Audit records.","ref":"Lightning.Auditing.html"},{"type":"function","title":"Lightning.Auditing.list_all/1","doc":"","ref":"Lightning.Auditing.html#list_all/1"},{"type":"behaviour","title":"Lightning.Auditing.Audit","doc":"Macro module to add common model behaviour to a given Ecto model","ref":"Lightning.Auditing.Audit.html"},{"type":"function","title":"Lightning.Auditing.Audit.event/6","doc":"Creates a `changeset` for the `event` identified by `item_id` and caused\nby `actor_id`.\n\nThe given `changes` can be either `nil`, `Ecto.Changeset`, struct or map.\n\nIt returns `:no_changes` in case of an `Ecto.Changeset` changes that changed nothing\nor an `Ecto.Changeset` with the event ready to be inserted.","ref":"Lightning.Auditing.Audit.html#event/6"},{"type":"function","title":"Lightning.Auditing.Audit.save/2","doc":"Saves the event to the `Repo`.\n\nIn case of nothing changes, do nothing.\n\nIt returns `{:ok, :no_changes}` if nothing changed, `{:ok, struct}` if the log\nhas been successfully saved or `{:error, changeset}` in case of error.","ref":"Lightning.Auditing.Audit.html#save/2"},{"type":"callback","title":"Lightning.Auditing.Audit.update_changes/1","doc":"","ref":"Lightning.Auditing.Audit.html#c:update_changes/1"},{"type":"module","title":"Lightning.AuthProviders","doc":"Context module for dealing with external Auth Providers.","ref":"Lightning.AuthProviders.html"},{"type":"function","title":"Lightning.AuthProviders.build_handler/2","doc":"","ref":"Lightning.AuthProviders.html#build_handler/2"},{"type":"function","title":"Lightning.AuthProviders.create/1","doc":"","ref":"Lightning.AuthProviders.html#create/1"},{"type":"function","title":"Lightning.AuthProviders.create_handler/1","doc":"","ref":"Lightning.AuthProviders.html#create_handler/1"},{"type":"function","title":"Lightning.AuthProviders.delete!/1","doc":"","ref":"Lightning.AuthProviders.html#delete!/1"},{"type":"function","title":"Lightning.AuthProviders.get_authorize_url/1","doc":"Retrieve the authorization url for a given handler or handler name.","ref":"Lightning.AuthProviders.html#get_authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.get_existing/0","doc":"","ref":"Lightning.AuthProviders.html#get_existing/0"},{"type":"function","title":"Lightning.AuthProviders.get_existing/1","doc":"","ref":"Lightning.AuthProviders.html#get_existing/1"},{"type":"function","title":"Lightning.AuthProviders.get_handler/1","doc":"","ref":"Lightning.AuthProviders.html#get_handler/1"},{"type":"function","title":"Lightning.AuthProviders.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.new/0","doc":"","ref":"Lightning.AuthProviders.html#new/0"},{"type":"function","title":"Lightning.AuthProviders.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.html#remove_handler/1"},{"type":"function","title":"Lightning.AuthProviders.update/2","doc":"","ref":"Lightning.AuthProviders.html#update/2"},{"type":"module","title":"Lightning.AuthProviders.AuthConfig","doc":"AuthProvider model","ref":"Lightning.AuthProviders.AuthConfig.html"},{"type":"type","title":"Lightning.AuthProviders.AuthConfig.t/0","doc":"","ref":"Lightning.AuthProviders.AuthConfig.html#t:t/0"},{"type":"module","title":"Lightning.AuthProviders.CacheWarmer","doc":"Dummy warmer which caches database rows every 30s.","ref":"Lightning.AuthProviders.CacheWarmer.html"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.AuthProviders.CacheWarmer.html#child_spec/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.execute/1","doc":"Executes this cache warmer with a connection.","ref":"Lightning.AuthProviders.CacheWarmer.html#execute/1"},{"type":"function","title":"Lightning.AuthProviders.CacheWarmer.interval/0","doc":"Returns the interval for this warmer.","ref":"Lightning.AuthProviders.CacheWarmer.html#interval/0"},{"type":"module","title":"Lightning.AuthProviders.Common","doc":"Provides common functionality for handling OAuth authentication across different providers.","ref":"Lightning.AuthProviders.Common.html"},{"type":"function","title":"Lightning.AuthProviders.Common.authorize_url/4","doc":"Constructs the authorization URL with the given client, state, scopes, and options.","ref":"Lightning.AuthProviders.Common.html#authorize_url/4"},{"type":"function","title":"Lightning.AuthProviders.Common.build_client/3","doc":"Builds a new OAuth client with the specified configuration, authorization URL, token URL, and options.","ref":"Lightning.AuthProviders.Common.html#build_client/3"},{"type":"function","title":"Lightning.AuthProviders.Common.get_token/2","doc":"Requests an authentication token from the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Common.get_userinfo/3","doc":"Retrieves user information from the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#get_userinfo/3"},{"type":"function","title":"Lightning.AuthProviders.Common.get_wellknown/1","doc":"Fetches the well-known configuration from the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#get_wellknown/1"},{"type":"function","title":"Lightning.AuthProviders.Common.get_wellknown!/1","doc":"Fetches the well-known configuration from the OAuth provider and raises an error if not successful.","ref":"Lightning.AuthProviders.Common.html#get_wellknown!/1"},{"type":"function","title":"Lightning.AuthProviders.Common.introspect/3","doc":"","ref":"Lightning.AuthProviders.Common.html#introspect/3"},{"type":"function","title":"Lightning.AuthProviders.Common.refresh_token/2","doc":"Refreshes the authentication token using the OAuth provider.","ref":"Lightning.AuthProviders.Common.html#refresh_token/2"},{"type":"function","title":"Lightning.AuthProviders.Common.still_fresh/3","doc":"Checks if a token is still valid or must be refreshed. If expires_at is nil,\nit will return `false`, forcing a refresh. If the token has already expired or\nwill expire before the default buffer (in the next 5 minutes) we return\n`false`, forcing a refresh.","ref":"Lightning.AuthProviders.Common.html#still_fresh/3"},{"type":"module","title":"Lightning.AuthProviders.Common.TokenBody","doc":"Defines a schema for OAuth token information.","ref":"Lightning.AuthProviders.Common.TokenBody.html"},{"type":"function","title":"Lightning.AuthProviders.Common.TokenBody.from_oauth2_token/1","doc":"Converts an OAuth2 token to a TokenBody struct.","ref":"Lightning.AuthProviders.Common.TokenBody.html#from_oauth2_token/1"},{"type":"function","title":"Lightning.AuthProviders.Common.TokenBody.new/1","doc":"Creates a new TokenBody struct with the given attributes.","ref":"Lightning.AuthProviders.Common.TokenBody.html#new/1"},{"type":"module","title":"Lightning.AuthProviders.Google","doc":"Handles the specifics of the Google OAuth authentication process.","ref":"Lightning.AuthProviders.Google.html"},{"type":"function","title":"Lightning.AuthProviders.Google.provider_name/0","doc":"","ref":"Lightning.AuthProviders.Google.html#provider_name/0"},{"type":"function","title":"Lightning.AuthProviders.Google.scopes/0","doc":"","ref":"Lightning.AuthProviders.Google.html#scopes/0"},{"type":"function","title":"Lightning.AuthProviders.Google.scopes_doc_url/0","doc":"","ref":"Lightning.AuthProviders.Google.html#scopes_doc_url/0"},{"type":"function","title":"Lightning.AuthProviders.Google.wellknown_url/1","doc":"","ref":"Lightning.AuthProviders.Google.html#wellknown_url/1"},{"type":"module","title":"Lightning.AuthProviders.Handler","doc":"Module which wraps Oauth configuration and a WellKnown document\ninto a convenient struct that can be used to authenticate users against\nany OIDC compliant provider.","ref":"Lightning.AuthProviders.Handler.html"},{"type":"function","title":"Lightning.AuthProviders.Handler.authorize_url/1","doc":"","ref":"Lightning.AuthProviders.Handler.html#authorize_url/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.from_model/1","doc":"Returns a Handler from a given AuthConfig","ref":"Lightning.AuthProviders.Handler.html#from_model/1"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_token/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_token/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.get_userinfo/2","doc":"","ref":"Lightning.AuthProviders.Handler.html#get_userinfo/2"},{"type":"function","title":"Lightning.AuthProviders.Handler.new/2","doc":"Create a new Provider struct, expects a name and opts:\n\n- `:client_id` - The providers issued id\n- `:client_secret` - Secret for the client\n- `:redirect_uri` - The URI for redirecting after authentication,\n usually the callback url in the router.\n- `:wellknown` - A AuthProviders.WellKnown struct with the providers\n `.well-known/openid-configuration`.","ref":"Lightning.AuthProviders.Handler.html#new/2"},{"type":"type","title":"Lightning.AuthProviders.Handler.opts/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:opts/0"},{"type":"type","title":"Lightning.AuthProviders.Handler.t/0","doc":"","ref":"Lightning.AuthProviders.Handler.html#t:t/0"},{"type":"behaviour","title":"Lightning.AuthProviders.OAuthBehaviour","doc":"Defines a behaviour for OAuth providers within the Lightning application,\nspecifying a common interface for OAuth operations.\nThis interface ensures consistency and interoperability among different\nauthentication providers (e.g., Google, Salesforce)\nby defining a set of required functions that each provider must implement.","ref":"Lightning.AuthProviders.OAuthBehaviour.html"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.authorize_url/4","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:authorize_url/4"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.build_client/1","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:build_client/1"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.get_token/3","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:get_token/3"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.get_userinfo/3","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:get_userinfo/3"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.refresh_token/2","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:refresh_token/2"},{"type":"callback","title":"Lightning.AuthProviders.OAuthBehaviour.refresh_token/3","doc":"","ref":"Lightning.AuthProviders.OAuthBehaviour.html#c:refresh_token/3"},{"type":"module","title":"Lightning.AuthProviders.OauthHTTPClient","doc":"Handles OAuth interactions for generic providers, including token fetching,\nrefreshing, and user information retrieval. This module uses Tesla to make HTTP\nrequests configured with middleware appropriate for OAuth specific tasks.","ref":"Lightning.AuthProviders.OauthHTTPClient.html"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.delete/3","doc":"Perform a DELETE request.\n\nSee `request/1` or `request/2` for options definition.\n\n delete(\"/users\")\n delete(\"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\")\n delete(client, \"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#delete/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.delete!/3","doc":"Perform a DELETE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n delete!(\"/users\")\n delete!(\"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\")\n delete!(client, \"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#delete!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.fetch_token/2","doc":"Fetches a new token using the authorization code provided by the OAuth provider.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_token/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.fetch_token/2","doc":"- `client`: The client configuration containing client_id, client_secret, and token_endpoint.\n- `code`: The authorization code received from the OAuth provider.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_token/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.fetch_token/2","doc":"- `{:ok, token_data}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_token/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.fetch_userinfo/2","doc":"Fetches user information from the OAuth provider using a valid access token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_userinfo/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.fetch_userinfo/2","doc":"- `client`: The client configuration containing userinfo_endpoint.\n- `token`: The token configuration containing access_token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_userinfo/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.fetch_userinfo/2","doc":"- `{:ok, user_info}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#fetch_userinfo/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.generate_authorize_url/2","doc":"Generates an authorization URL with specified parameters.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#generate_authorize_url/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.generate_authorize_url/2","doc":"- `client`: The client configuration containing client_id, and authorization_endpoint.\n- `params`: Additional parameters to include in the authorization URL.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#generate_authorize_url/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.generate_authorize_url/2","doc":"- The fully formed authorization URL as a string.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#generate_authorize_url/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#get/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#get!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#head/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#head!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#options/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#options!/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#patch/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#patch!/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.post/4","doc":"Perform a POST request.\n\nSee `request/1` or `request/2` for options definition.\n\n post(\"/users\", %{name: \"Jon\"})\n post(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post(client, \"/users\", %{name: \"Jon\"})\n post(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#post/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.post!/4","doc":"Perform a POST request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n post!(\"/users\", %{name: \"Jon\"})\n post!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post!(client, \"/users\", %{name: \"Jon\"})\n post!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#post!/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.put/4","doc":"Perform a PUT request.\n\nSee `request/1` or `request/2` for options definition.\n\n put(\"/users\", %{name: \"Jon\"})\n put(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put(client, \"/users\", %{name: \"Jon\"})\n put(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#put/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.put!/4","doc":"Perform a PUT request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n put!(\"/users\", %{name: \"Jon\"})\n put!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put!(client, \"/users\", %{name: \"Jon\"})\n put!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.AuthProviders.OauthHTTPClient.html#put!/4"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.refresh_token/2","doc":"Refreshes an existing token using the refresh token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#refresh_token/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.refresh_token/2","doc":"- `client`: The client configuration containing client_id, client_secret, and token_endpoint.\n- `token`: The token configuration containing refresh_token","ref":"Lightning.AuthProviders.OauthHTTPClient.html#refresh_token/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.refresh_token/2","doc":"- `{:ok, refreshed_token_data}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#refresh_token/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.request/2","doc":"Perform a request.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request/2"},{"type":"function","title":"Options - Lightning.AuthProviders.OauthHTTPClient.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request/2-options"},{"type":"function","title":"Examples - Lightning.AuthProviders.OauthHTTPClient.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request/2-examples"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#request!/2"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.revoke_token/2","doc":"Revokes an OAuth token.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#revoke_token/2"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.revoke_token/2","doc":"- `client`: The client configuration containing client_id and client_secret.\n- `token`: The token to be revoked (access_token or refresh_token).","ref":"Lightning.AuthProviders.OauthHTTPClient.html#revoke_token/2-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.revoke_token/2","doc":"- `{:ok, response}` on success\n- `{:error, reason}` on failure","ref":"Lightning.AuthProviders.OauthHTTPClient.html#revoke_token/2-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.still_fresh/3","doc":"Determines if the token data is still considered fresh.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#still_fresh/3"},{"type":"function","title":"Parameters - Lightning.AuthProviders.OauthHTTPClient.still_fresh/3","doc":"- `token`: a map containing token data with `expires_at` or `expires_in` keys.\n- `threshold`: the number of time units before expiration to consider the token still fresh.\n- `time_unit`: the unit of time to consider for the threshold comparison.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#still_fresh/3-parameters"},{"type":"function","title":"Returns - Lightning.AuthProviders.OauthHTTPClient.still_fresh/3","doc":"- `true` if the token is fresh.\n- `{:error, reason}` if the token's expiration data is missing or invalid.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#still_fresh/3-returns"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#trace/3"},{"type":"function","title":"Lightning.AuthProviders.OauthHTTPClient.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.AuthProviders.OauthHTTPClient.html#trace!/3"},{"type":"type","title":"Lightning.AuthProviders.OauthHTTPClient.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"Lightning.AuthProviders.OauthHTTPClient.html#t:option/0"},{"type":"module","title":"Lightning.AuthProviders.Salesforce","doc":"Handles the specifics of the Salesforce OAuth authentication process.","ref":"Lightning.AuthProviders.Salesforce.html"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.provider_name/0","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#provider_name/0"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.scopes/0","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#scopes/0"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.scopes_doc_url/0","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#scopes_doc_url/0"},{"type":"function","title":"Lightning.AuthProviders.Salesforce.wellknown_url/1","doc":"","ref":"Lightning.AuthProviders.Salesforce.html#wellknown_url/1"},{"type":"module","title":"Lightning.AuthProviders.Store","doc":"Store module for caching Handlers.\n\nSince Handlers often have to fetch their `.well-known` files when being\ninitialized we cache these in order to avoid repeatedly making HTTP requests\nto a providers API.","ref":"Lightning.AuthProviders.Store.html"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.get_handlers/0","doc":"","ref":"Lightning.AuthProviders.Store.html#get_handlers/0"},{"type":"function","title":"Lightning.AuthProviders.Store.put_handler/2","doc":"","ref":"Lightning.AuthProviders.Store.html#put_handler/2"},{"type":"function","title":"Lightning.AuthProviders.Store.remove_handler/1","doc":"","ref":"Lightning.AuthProviders.Store.html#remove_handler/1"},{"type":"type","title":"Lightning.AuthProviders.Store.finder/0","doc":"","ref":"Lightning.AuthProviders.Store.html#t:finder/0"},{"type":"module","title":"Lightning.AuthProviders.WellKnown","doc":"A datastructure to fetch and hold information about a given OIDC/OAuth provider","ref":"Lightning.AuthProviders.WellKnown.html"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete/3","doc":"Issues a DELETE request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#delete!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.fetch!/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#fetch!/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get/3","doc":"Issues a GET request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#get!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head/3","doc":"Issues a HEAD request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#head!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.new/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#new/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options/3","doc":"Issues an OPTIONS request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#options!/3"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch/4","doc":"Issues a PATCH request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#patch!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post/4","doc":"Issues a POST request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#post!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_headers/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_body/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_headers/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_options/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_options/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_params/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_params/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_request_url/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_request_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_body/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_body/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_chunk/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_chunk/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_headers/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_headers/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_response_status_code/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_response_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_status_code/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_status_code/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.process_url/1","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#process_url/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put/4","doc":"Issues a PUT request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#put!/4"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/1","doc":"Issues an HTTP request using an `HTTPoison.Request` struct.\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AuthProviders.WellKnown.html#request/1"},{"type":"function","title":"Redirect handling - Lightning.AuthProviders.WellKnown.request/1","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AuthProviders.WellKnown.html#request/1-redirect-handling"},{"type":"function","title":"Examples - Lightning.AuthProviders.WellKnown.request/1","doc":"request = %HTTPoison.Request{\n method: :post,\n url: \"https://my.website.com\",\n body: \"{\\\"foo\\\": 3}\",\n headers: [{\"Accept\", \"application/json\"}]\n }\n\n request(request)","ref":"Lightning.AuthProviders.WellKnown.html#request/1-examples"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request/5","doc":"Issues an HTTP request with the given method to the given url.\n\nThis function is usually used indirectly by `get/3`, `post/4`, `put/4`, etc\n\nArgs:\n * `method` - HTTP method as an atom (`:get`, `:head`, `:post`, `:put`,\n `:delete`, etc.)\n * `url` - target url as a binary string or char list\n * `body` - request body. See more below\n * `headers` - HTTP headers as an orddict (e.g., `[{\"Accept\", \"application/json\"}]`)\n * `options` - Keyword list of options\n\nBody: see type `HTTPoison.Request`\n\nOptions: see type `HTTPoison.Request`\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Lightning.AuthProviders.WellKnown.html#request/5"},{"type":"function","title":"Redirect handling - Lightning.AuthProviders.WellKnown.request/5","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Lightning.AuthProviders.WellKnown.html#request/5-redirect-handling"},{"type":"function","title":"Examples - Lightning.AuthProviders.WellKnown.request/5","doc":"request(:post, \"https://my.website.com\", \"{\\\"foo\\\": 3}\", [{\"Accept\", \"application/json\"}])","ref":"Lightning.AuthProviders.WellKnown.html#request/5-examples"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request!/1","doc":"Issues an HTTP request an `HTTPoison.Request` struct.\nexception in case of failure.\n\n`request!/1` works exactly like `request/1` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AuthProviders.WellKnown.html#request!/1"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an\nexception in case of failure.\n\n`request!/5` works exactly like `request/5` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Lightning.AuthProviders.WellKnown.html#request!/5"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Lightning.AuthProviders.WellKnown.html#start/0"},{"type":"function","title":"Lightning.AuthProviders.WellKnown.stream_next/1","doc":"Requests the next message to be streamed for a given `HTTPoison.AsyncResponse`.\n\nSee `request!/5` for more detailed information.","ref":"Lightning.AuthProviders.WellKnown.html#stream_next/1"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.body/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:body/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.headers/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:headers/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.method/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:method/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.options/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:options/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.params/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:params/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.request/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:request/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.t/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:t/0"},{"type":"type","title":"Lightning.AuthProviders.WellKnown.url/0","doc":"","ref":"Lightning.AuthProviders.WellKnown.html#t:url/0"},{"type":"module","title":"Lightning.BuildMacros","doc":"Macros for building Lightning.","ref":"Lightning.BuildMacros.html"},{"type":"macro","title":"Lightning.BuildMacros.do_in/2","doc":"Conditionally evaluates the block if the current environment is in the\ngiven list of environments.","ref":"Lightning.BuildMacros.html#do_in/2"},{"type":"macro","title":"Examples - Lightning.BuildMacros.do_in/2","doc":"do_in(:dev) do\n IO.puts(\"This will only be printed in the dev environment\")\n end\n\n do_in([:dev, :test]) do\n IO.puts(\"This will only be printed in the dev and test environments\")\n end","ref":"Lightning.BuildMacros.html#do_in/2-examples"},{"type":"module","title":"Lightning.CLI","doc":"Module providing facilities to make calls to the OpenFn CLI.\n\nSee [@openfn/cli](https://github.com/OpenFn/kit/tree/main/packages/cli#openfncli)","ref":"Lightning.CLI.html"},{"type":"function","title":"Lightning.CLI.execute/1","doc":"Execute a command in a child process and parse the results.","ref":"Lightning.CLI.html#execute/1"},{"type":"function","title":"Lightning.CLI.metadata/2","doc":"Retrieve metadata for a given adaptor and configuration.","ref":"Lightning.CLI.html#metadata/2"},{"type":"module","title":"Lightning.CLI.Result","doc":"Struct that wraps the output of an OpenFn CLI call.\n\nContaining the keys:\n\n- `start_time`\n- `end_time`\n- `status`\n- `logs`","ref":"Lightning.CLI.Result.html"},{"type":"module","title":"Logs - Lightning.CLI.Result","doc":"The OpenFn CLI returns JSON formatted log lines, which are decoded and added\nto a `Result` struct.\n\nThere are two kinds of output:\n\n```\n{\"level\":\" >\",\"name\":\" >\",\"message\":\"...\"],\"time\": >}\n```\n\nThese are usually for general logging, and debugging.\n\n```\n{\"message\":[\" >\"]}\n```\n\nThe above is the equivalent of the output of a command","ref":"Lightning.CLI.Result.html#module-logs"},{"type":"function","title":"Lightning.CLI.Result.get_messages/1","doc":"Returns `message` type log lines from a `Result`.","ref":"Lightning.CLI.Result.html#get_messages/1"},{"type":"function","title":"Lightning.CLI.Result.new/1","doc":"","ref":"Lightning.CLI.Result.html#new/1"},{"type":"function","title":"Lightning.CLI.Result.parse/2","doc":"","ref":"Lightning.CLI.Result.html#parse/2"},{"type":"type","title":"Lightning.CLI.Result.t/0","doc":"","ref":"Lightning.CLI.Result.html#t:t/0"},{"type":"module","title":"Lightning.ChangesetUtils","doc":"Extra functions for Ecto.Changeset.","ref":"Lightning.ChangesetUtils.html"},{"type":"function","title":"Lightning.ChangesetUtils.put_if_provided/3","doc":"Puts a new change in the changeset if the params have the field.\n\nUseful when params don't have a given key and you don't want to set the\nfield to `nil`.","ref":"Lightning.ChangesetUtils.html#put_if_provided/3"},{"type":"function","title":"Lightning.ChangesetUtils.put_new_change/3","doc":"Puts a new change in the changeset if the field is not already set.\n\nNOTE: This function considers a field with a `nil` value as not set.","ref":"Lightning.ChangesetUtils.html#put_new_change/3"},{"type":"module","title":"Lightning.DashboardStats","doc":"Dashboard stats for a project and its workflows.","ref":"Lightning.DashboardStats.html"},{"type":"function","title":"Lightning.DashboardStats.aggregate_project_metrics/1","doc":"","ref":"Lightning.DashboardStats.html#aggregate_project_metrics/1"},{"type":"function","title":"Lightning.DashboardStats.filter_days_ago/2","doc":"","ref":"Lightning.DashboardStats.html#filter_days_ago/2"},{"type":"function","title":"Lightning.DashboardStats.get_workflow_stats/1","doc":"","ref":"Lightning.DashboardStats.html#get_workflow_stats/1"},{"type":"module","title":"Lightning.DashboardStats.ProjectMetrics","doc":"Aggregated metrics for a project.","ref":"Lightning.DashboardStats.ProjectMetrics.html"},{"type":"module","title":"Lightning.DashboardStats.WorkflowStats","doc":"Stats for each workflow.\n\nRuns and WorkOrders counting are grouped by state.","ref":"Lightning.DashboardStats.WorkflowStats.html"},{"type":"module","title":"Lightning.DataclipScrubber","doc":"Handles scrubbing of dataclips","ref":"Lightning.DataclipScrubber.html"},{"type":"function","title":"Lightning.DataclipScrubber.scrub_dataclip_body!/1","doc":"","ref":"Lightning.DataclipScrubber.html#scrub_dataclip_body!/1"},{"type":"module","title":"Lightning.Demo","doc":"Demo encapsulates logic for setting up a demonstration site.","ref":"Lightning.Demo.html"},{"type":"function","title":"Lightning.Demo.reset_demo/0","doc":"Deletes everything in the database including the superuser and creates a set\nof publicly available users for a demo site via a command that can be run on\nKubernetes-deployed systems.","ref":"Lightning.Demo.html#reset_demo/0"},{"type":"module","title":"Lightning.ExportUtils","doc":"Module that expose a function generating a complete and valid yaml string\nfrom a project and its workflows.","ref":"Lightning.ExportUtils.html"},{"type":"function","title":"Lightning.ExportUtils.build_yaml_tree/2","doc":"","ref":"Lightning.ExportUtils.html#build_yaml_tree/2"},{"type":"function","title":"Lightning.ExportUtils.generate_new_yaml/2","doc":"","ref":"Lightning.ExportUtils.html#generate_new_yaml/2"},{"type":"behaviour","title":"Lightning.Extensions.AccountHooking","doc":"Allows handling user creation or registration atomically without relying on async events.","ref":"Lightning.Extensions.AccountHooking.html"},{"type":"callback","title":"Lightning.Extensions.AccountHooking.handle_create_user/1","doc":"","ref":"Lightning.Extensions.AccountHooking.html#c:handle_create_user/1"},{"type":"callback","title":"Lightning.Extensions.AccountHooking.handle_register_superuser/1","doc":"","ref":"Lightning.Extensions.AccountHooking.html#c:handle_register_superuser/1"},{"type":"callback","title":"Lightning.Extensions.AccountHooking.handle_register_user/1","doc":"","ref":"Lightning.Extensions.AccountHooking.html#c:handle_register_user/1"},{"type":"module","title":"Lightning.Extensions.FifoRunQueue","doc":"Allows adding, removing or claiming work to be executed by the Runtime.","ref":"Lightning.Extensions.FifoRunQueue.html"},{"type":"module","title":"Lightning.Extensions.Message","doc":"Message for the limiters to communicate with the client.","ref":"Lightning.Extensions.Message.html"},{"type":"type","title":"Lightning.Extensions.Message.t/0","doc":"","ref":"Lightning.Extensions.Message.html#t:t/0"},{"type":"module","title":"Lightning.Extensions.ProjectHook","doc":"Allows handling user creation or registration atomically without relying on async events.","ref":"Lightning.Extensions.ProjectHook.html"},{"type":"function","title":"Lightning.Extensions.ProjectHook.handle_create_project/1","doc":"","ref":"Lightning.Extensions.ProjectHook.html#handle_create_project/1"},{"type":"function","title":"Lightning.Extensions.ProjectHook.handle_delete_project/1","doc":"","ref":"Lightning.Extensions.ProjectHook.html#handle_delete_project/1"},{"type":"behaviour","title":"Lightning.Extensions.ProjectHooking","doc":"Allows handling project creation atomically without relying on async events.","ref":"Lightning.Extensions.ProjectHooking.html"},{"type":"callback","title":"Lightning.Extensions.ProjectHooking.handle_create_project/1","doc":"","ref":"Lightning.Extensions.ProjectHooking.html#c:handle_create_project/1"},{"type":"callback","title":"Lightning.Extensions.ProjectHooking.handle_delete_project/1","doc":"","ref":"Lightning.Extensions.ProjectHooking.html#c:handle_delete_project/1"},{"type":"module","title":"Lightning.Extensions.RateLimiter","doc":"Rate limiting stub for Lightning.","ref":"Lightning.Extensions.RateLimiter.html"},{"type":"behaviour","title":"Lightning.Extensions.RateLimiting","doc":"Rate limiting for Lightning API endpoints.","ref":"Lightning.Extensions.RateLimiting.html"},{"type":"callback","title":"Lightning.Extensions.RateLimiting.limit_request/3","doc":"","ref":"Lightning.Extensions.RateLimiting.html#c:limit_request/3"},{"type":"type","title":"Lightning.Extensions.RateLimiting.message/0","doc":"","ref":"Lightning.Extensions.RateLimiting.html#t:message/0"},{"type":"type","title":"Lightning.Extensions.RateLimiting.request_error/0","doc":"","ref":"Lightning.Extensions.RateLimiting.html#t:request_error/0"},{"type":"module","title":"Lightning.Extensions.RateLimiting.Context","doc":"Which user is making the request for a certain project.","ref":"Lightning.Extensions.RateLimiting.Context.html"},{"type":"type","title":"Lightning.Extensions.RateLimiting.Context.t/0","doc":"","ref":"Lightning.Extensions.RateLimiting.Context.html#t:t/0"},{"type":"behaviour","title":"Lightning.Extensions.RunQueue","doc":"Extension to customize the scheduling of workloads on Lightning Runtime.","ref":"Lightning.Extensions.RunQueue.html"},{"type":"callback","title":"Lightning.Extensions.RunQueue.claim/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:claim/1"},{"type":"callback","title":"Lightning.Extensions.RunQueue.dequeue/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:dequeue/1"},{"type":"callback","title":"Lightning.Extensions.RunQueue.enqueue/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:enqueue/1"},{"type":"callback","title":"Lightning.Extensions.RunQueue.enqueue_many/1","doc":"","ref":"Lightning.Extensions.RunQueue.html#c:enqueue_many/1"},{"type":"module","title":"Lightning.Extensions.UsageLimiter","doc":"Runtime limiting stub for Lightning.","ref":"Lightning.Extensions.UsageLimiter.html"},{"type":"behaviour","title":"Lightning.Extensions.UsageLimiting","doc":"Rate limiting for Lightning workloads that depends on Runtime.","ref":"Lightning.Extensions.UsageLimiting.html"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.check_limits/1","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:check_limits/1"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.get_run_options/1","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:get_run_options/1"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.increment_ai_queries/1","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:increment_ai_queries/1"},{"type":"callback","title":"Lightning.Extensions.UsageLimiting.limit_action/2","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#c:limit_action/2"},{"type":"type","title":"Lightning.Extensions.UsageLimiting.error/0","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#t:error/0"},{"type":"type","title":"Lightning.Extensions.UsageLimiting.error_reason/0","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#t:error_reason/0"},{"type":"type","title":"Lightning.Extensions.UsageLimiting.message/0","doc":"","ref":"Lightning.Extensions.UsageLimiting.html#t:message/0"},{"type":"module","title":"Lightning.FailureNotifierView","doc":"","ref":"Lightning.FailureNotifierView.html"},{"type":"function","title":"Lightning.FailureNotifierView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"Lightning.FailureNotifierView.html#__resource__/0"},{"type":"function","title":"Lightning.FailureNotifierView.failure_alert.html/1","doc":"","ref":"Lightning.FailureNotifierView.html#failure_alert.html/1"},{"type":"function","title":"Lightning.FailureNotifierView.render/2","doc":"Renders the given template locally.","ref":"Lightning.FailureNotifierView.html#render/2"},{"type":"function","title":"Lightning.FailureNotifierView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"Lightning.FailureNotifierView.html#template_not_found/2"},{"type":"module","title":"Lightning.Graph","doc":"A graph model for workflows transversal.","ref":"Lightning.Graph.html"},{"type":"function","title":"Lightning.Graph.add_edge/3","doc":"","ref":"Lightning.Graph.html#add_edge/3"},{"type":"function","title":"Lightning.Graph.new/0","doc":"","ref":"Lightning.Graph.html#new/0"},{"type":"function","title":"Lightning.Graph.nodes/2","doc":"","ref":"Lightning.Graph.html#nodes/2"},{"type":"function","title":"Lightning.Graph.prune/2","doc":"","ref":"Lightning.Graph.html#prune/2"},{"type":"function","title":"Lightning.Graph.remove_edges/2","doc":"","ref":"Lightning.Graph.html#remove_edges/2"},{"type":"type","title":"Lightning.Graph.t/0","doc":"","ref":"Lightning.Graph.html#t:t/0"},{"type":"module","title":"Lightning.Helpers","doc":"Common functions for the context","ref":"Lightning.Helpers.html"},{"type":"function","title":"Lightning.Helpers.actual_deletion_date/3","doc":"","ref":"Lightning.Helpers.html#actual_deletion_date/3"},{"type":"function","title":"Lightning.Helpers.coerce_json_field/2","doc":"Changes a given maps field from a json string to a map.\nIf it cannot be converted, it leaves the original value","ref":"Lightning.Helpers.html#coerce_json_field/2"},{"type":"function","title":"Lightning.Helpers.format_date/2","doc":"","ref":"Lightning.Helpers.html#format_date/2"},{"type":"function","title":"Lightning.Helpers.json_safe/1","doc":"Recursively ensures a given map is safe to convert to JSON,\nwhere all keys are strings and all values are json safe (primitive values).","ref":"Lightning.Helpers.html#json_safe/1"},{"type":"function","title":"Lightning.Helpers.ms_to_human/1","doc":"Converts milliseconds (integer) to a human duration, such as \"1 minute\" or\n\"45 years, 6 months, 5 days, 21 hours, 12 minutes, 34 seconds\" using\n`Timex.Format.Duration.Formatters.Humanized.format()`.","ref":"Lightning.Helpers.html#ms_to_human/1"},{"type":"module","title":"Lightning.Janitor","doc":"The Janitor is responsible for detecting runs that have been \"lost\" due to\ncommunication issues with the worker.\n\nEvery X minutes the Janitor will check to ensure that no runs have been\nrunning for more than Y seconds.\n\nConfigure your maximum run runtime with a WORKER_MAX_RUN_DURATION_SECONDS environment\nvariable; the grace period will be an additional 20%.","ref":"Lightning.Janitor.html"},{"type":"function","title":"Lightning.Janitor.find_and_update_lost/0","doc":"The find_and_update_lost function determines the current time, finds all\nruns that were claimed before the earliest allowable claim time for\nunfinished runs, and marks them as lost.","ref":"Lightning.Janitor.html#find_and_update_lost/0"},{"type":"function","title":"Lightning.Janitor.perform/1","doc":"The perform function takes an `%Oban.Job`, allowing this module to be invoked\nby the Oban cron plugin.","ref":"Lightning.Janitor.html#perform/1"},{"type":"module","title":"Lightning.KafkaTriggers","doc":"Contains the logic to manage kafka trigger and their associated pipelines.","ref":"Lightning.KafkaTriggers.html"},{"type":"function","title":"Lightning.KafkaTriggers.build_topic_partition_offset/1","doc":"Generate the key that is used to identify duplicate messages when used in\nassociation with the trigger id.","ref":"Lightning.KafkaTriggers.html#build_topic_partition_offset/1"},{"type":"function","title":"Lightning.KafkaTriggers.convert_rate_limit/0","doc":"","ref":"Lightning.KafkaTriggers.html#convert_rate_limit/0"},{"type":"function","title":"Lightning.KafkaTriggers.enable_disable_triggers/1","doc":"","ref":"Lightning.KafkaTriggers.html#enable_disable_triggers/1"},{"type":"function","title":"Lightning.KafkaTriggers.find_enabled_triggers/0","doc":"","ref":"Lightning.KafkaTriggers.html#find_enabled_triggers/0"},{"type":"function","title":"Lightning.KafkaTriggers.generate_pipeline_child_spec/1","doc":"Generate the child spec needed to start a `Pipeline` child process.","ref":"Lightning.KafkaTriggers.html#generate_pipeline_child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.get_kafka_triggers_being_updated/1","doc":"","ref":"Lightning.KafkaTriggers.html#get_kafka_triggers_being_updated/1"},{"type":"function","title":"Lightning.KafkaTriggers.initial_policy/1","doc":"","ref":"Lightning.KafkaTriggers.html#initial_policy/1"},{"type":"function","title":"Lightning.KafkaTriggers.start_triggers/0","doc":"","ref":"Lightning.KafkaTriggers.html#start_triggers/0"},{"type":"function","title":"Lightning.KafkaTriggers.update_pipeline/2","doc":"","ref":"Lightning.KafkaTriggers.html#update_pipeline/2"},{"type":"module","title":"Lightning.KafkaTriggers.DuplicateTrackingCleanupWorker","doc":"Responsible for cleaning up stale TriggerKafkaMessageRecords entries.\nTriggerKafkaMessageRecords are used to deduplicate incoming messages from\na Kafka cluster.","ref":"Lightning.KafkaTriggers.DuplicateTrackingCleanupWorker.html"},{"type":"module","title":"Lightning.KafkaTriggers.EventListener","doc":"Listens for events related to Kafka triggers and updates the affected pipeline\nprocess by enabling, reloading or disabling it.","ref":"Lightning.KafkaTriggers.EventListener.html"},{"type":"function","title":"Lightning.KafkaTriggers.EventListener.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.KafkaTriggers.EventListener.html#child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.EventListener.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.EventListener.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.MessageHandling","doc":"Contains the logic to persist a Kafka messages as a WorkOrder, Run and\nDataclip.","ref":"Lightning.KafkaTriggers.MessageHandling.html"},{"type":"function","title":"Lightning.KafkaTriggers.MessageHandling.persist_message/3","doc":"","ref":"Lightning.KafkaTriggers.MessageHandling.html#persist_message/3"},{"type":"module","title":"Lightning.KafkaTriggers.Pipeline","doc":"Broadway pipeline that processes messages from Kafka clusters and persists\nthe received messages if they are not duplicating a previous message.","ref":"Lightning.KafkaTriggers.Pipeline.html"},{"type":"function","title":"Lightning.KafkaTriggers.Pipeline.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.Pipeline.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.PipelineSupervisor","doc":"Supervisor of the BroadwayKafka pipelines that are created for each enabled\nKafka trigger.","ref":"Lightning.KafkaTriggers.PipelineSupervisor.html"},{"type":"function","title":"Lightning.KafkaTriggers.PipelineSupervisor.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.KafkaTriggers.PipelineSupervisor.html#child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.PipelineSupervisor.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.PipelineSupervisor.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.Supervisor","doc":"Starts all the processes needed to pull data from Kafka clusters and then\ngenerate work orders based on the messages received.","ref":"Lightning.KafkaTriggers.Supervisor.html"},{"type":"function","title":"Lightning.KafkaTriggers.Supervisor.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.KafkaTriggers.Supervisor.html#child_spec/1"},{"type":"function","title":"Lightning.KafkaTriggers.Supervisor.start_link/1","doc":"","ref":"Lightning.KafkaTriggers.Supervisor.html#start_link/1"},{"type":"module","title":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord","doc":"Persists a lightweight represenattion of a message that has been recevied from\na Kafka cluster, for the purpose of deduplication.","ref":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord.html"},{"type":"function","title":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord.changeset/2","doc":"","ref":"Lightning.KafkaTriggers.TriggerKafkaMessageRecord.html#changeset/2"},{"type":"module","title":"Lightning.MetadataService","doc":"Retrieves metadata for a given credential and adaptor using the OpenFn CLI.","ref":"Lightning.MetadataService.html"},{"type":"function","title":"Lightning.MetadataService.fetch/2","doc":"Retrieve metadata for a given adaptor and credential.\n\nThe adaptor must be an npm specification.","ref":"Lightning.MetadataService.html#fetch/2"},{"type":"exception","title":"Lightning.MetadataService.Error","doc":"","ref":"Lightning.MetadataService.Error.html"},{"type":"function","title":"Lightning.MetadataService.Error.message/1","doc":"","ref":"Lightning.MetadataService.Error.html#message/1"},{"type":"function","title":"Lightning.MetadataService.Error.new/1","doc":"","ref":"Lightning.MetadataService.Error.html#new/1"},{"type":"type","title":"Lightning.MetadataService.Error.t/0","doc":"","ref":"Lightning.MetadataService.Error.html#t:t/0"},{"type":"module","title":"Lightning.Name","doc":"Generates a random names.","ref":"Lightning.Name.html"},{"type":"function","title":"Lightning.Name.generate/1","doc":"","ref":"Lightning.Name.html#generate/1"},{"type":"module","title":"Lightning.OauthClients","doc":"Manages operations for OAuth clients within the Lightning application, providing\nfunctions to create, retrieve, update, and delete OAuth clients, as well as managing\ntheir associations with projects and handling audit trails for changes.","ref":"Lightning.OauthClients.html"},{"type":"function","title":"Lightning.OauthClients.change_client/2","doc":"Prepares a changeset for creating or updating an OAuth client.","ref":"Lightning.OauthClients.html#change_client/2"},{"type":"function","title":"Parameters - Lightning.OauthClients.change_client/2","doc":"- client: The OAuth client struct.\n - attrs: Attributes to update in the client.","ref":"Lightning.OauthClients.html#change_client/2-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.change_client/2","doc":"- An Ecto.Changeset struct for the OAuth client.","ref":"Lightning.OauthClients.html#change_client/2-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.change_client/2","doc":"iex> change_client(%OauthClient{}, %{name: \"New Client\"})\n %Ecto.Changeset{...}","ref":"Lightning.OauthClients.html#change_client/2-examples"},{"type":"function","title":"Lightning.OauthClients.create_client/1","doc":"Creates a new OAuth client with the specified attributes.","ref":"Lightning.OauthClients.html#create_client/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.create_client/1","doc":"- attrs: Map containing attributes for the new OAuth client.\n Required fields: `name`, `authorization_endpoint`, `token_endpoint`, `revocation_endpoint`, `client_id`, `client_secret`.","ref":"Lightning.OauthClients.html#create_client/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.create_client/1","doc":"- `{:ok, oauth_client}` if the client is created successfully.\n - `{:error, changeset}` if there is an error during creation due to validation failures or database issues.","ref":"Lightning.OauthClients.html#create_client/1-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.create_client/1","doc":"iex> create_client(%{name: \"New Client\"})\n {:ok, %OauthClient{}}\n\n iex> create_client(%{name: nil})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.OauthClients.html#create_client/1-examples"},{"type":"function","title":"Lightning.OauthClients.delete_client/1","doc":"Deletes an OAuth client and all associated data.","ref":"Lightning.OauthClients.html#delete_client/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.delete_client/1","doc":"- client: The OauthClient to delete.","ref":"Lightning.OauthClients.html#delete_client/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.delete_client/1","doc":"- A tuple {:ok, oauth_client} if deletion is successful.\n- A tuple {:error, changeset} if deletion fails.","ref":"Lightning.OauthClients.html#delete_client/1-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.delete_client/1","doc":"iex> delete_client(client)\n {:ok, %OauthClient{}}\n\n iex> delete_client(client)\n {:error, %Ecto.Changeset{}}","ref":"Lightning.OauthClients.html#delete_client/1-examples"},{"type":"function","title":"Lightning.OauthClients.get_client!/1","doc":"Retrieves a single OAuth client by its ID, raising an error if not found.","ref":"Lightning.OauthClients.html#get_client!/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.get_client!/1","doc":"- id: The ID of the OAuth client to retrieve.","ref":"Lightning.OauthClients.html#get_client!/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.get_client!/1","doc":"- The OAuth client struct.","ref":"Lightning.OauthClients.html#get_client!/1-returns"},{"type":"function","title":"Raises - Lightning.OauthClients.get_client!/1","doc":"- Ecto.NoResultsError if the OAuth client does not exist.","ref":"Lightning.OauthClients.html#get_client!/1-raises"},{"type":"function","title":"Examples - Lightning.OauthClients.get_client!/1","doc":"iex> get_client!(123)\n %OauthClient{}\n\n iex> get_client!(456)\n ** (Ecto.NoResultsError)","ref":"Lightning.OauthClients.html#get_client!/1-examples"},{"type":"function","title":"Lightning.OauthClients.list_clients/1","doc":"Retrieves all OAuth clients based on the given context, either a Project or a User.","ref":"Lightning.OauthClients.html#list_clients/1"},{"type":"function","title":"Parameters - Lightning.OauthClients.list_clients/1","doc":"- context: The Project or User struct to retrieve OAuth clients for.","ref":"Lightning.OauthClients.html#list_clients/1-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.list_clients/1","doc":"- A list of OAuth clients associated with the given Project or created by the given User.","ref":"Lightning.OauthClients.html#list_clients/1-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.list_clients/1","doc":"When given a Project:\n iex> list_clients(%Project{id: 1})\n [%OauthClient{project_id: 1}, %OauthClient{project_id: 1}]\n\n When given a User:\n iex> list_clients(%User{id: 123})\n [%OauthClient{user_id: 123}, %OauthClient{user_id: 123}]","ref":"Lightning.OauthClients.html#list_clients/1-examples"},{"type":"function","title":"Lightning.OauthClients.update_client/2","doc":"Updates an existing OAuth client with the specified attributes.","ref":"Lightning.OauthClients.html#update_client/2"},{"type":"function","title":"Parameters - Lightning.OauthClients.update_client/2","doc":"- client: The existing OauthClient to update.\n- attrs: A map of attributes to update.","ref":"Lightning.OauthClients.html#update_client/2-parameters"},{"type":"function","title":"Returns - Lightning.OauthClients.update_client/2","doc":"- A tuple {:ok, oauth_client} if update is successful.\n- A tuple {:error, changeset} if update fails.","ref":"Lightning.OauthClients.html#update_client/2-returns"},{"type":"function","title":"Examples - Lightning.OauthClients.update_client/2","doc":"iex> update_client(client, %{field: new_value})\n {:ok, %OauthClient{}}\n\n iex> update_client(client, %{field: bad_value})\n {:error, %Ecto.Changeset{}}","ref":"Lightning.OauthClients.html#update_client/2-examples"},{"type":"module","title":"Lightning.ObanManager","doc":"The Oban Manager","ref":"Lightning.ObanManager.html"},{"type":"function","title":"Lightning.ObanManager.handle_event/4","doc":"","ref":"Lightning.ObanManager.html#handle_event/4"},{"type":"module","title":"Lightning.Policies.Dataclips","doc":"The Bodyguard Policy module for dataclips actions","ref":"Lightning.Policies.Dataclips.html"},{"type":"function","title":"Lightning.Policies.Dataclips.authorize/3","doc":"","ref":"Lightning.Policies.Dataclips.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Dataclips.actions/0","doc":"","ref":"Lightning.Policies.Dataclips.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Exports","doc":"The Bodyguard Policy module for Exports","ref":"Lightning.Policies.Exports.html"},{"type":"function","title":"Lightning.Policies.Exports.authorize/3","doc":"","ref":"Lightning.Policies.Exports.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Exports.actions/0","doc":"","ref":"Lightning.Policies.Exports.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Permissions","doc":"This module defines a unique interface managing authorizations in Lightning.\n\nUsers in Lightning have instance-wide and project-wide roles which determine their level of access to resources in the application. Fo rmore details see the [documentation](https://docs.openfn.org/documentation/about-lightning#roles-and-permissions).\n\nThese authorizations policies are all implemented under the `lib/lightning/policies` folder. In that folder you can find 3 files:\n- The `users.ex` file has all the policies for the instances wide access levels\n- The `project_users.ex` file has all the policies for the project wide access levels\n- The `permissions.ex` file defines the `Lightning.Policies.Permissions.can/4` interface. Which is a wrapper around the `Bodyguard.permit/4` function.\nWe use that interface to be able to harmonize the use of policies accross the entire app.\n\nAll the policies are tested in the `test/lightning/policies` folder. And the test are written in a way that allows the reader to quickly who can do what in the app.\n\nWe have two variants of the `Lightning.Policies.Permissions.can/4` interface:\n- `Lightning.Policies.Permissions.can(policy, action, actor, resource)` returns `:ok` if the actor can perform the action on the resource and `{:error, :unauthorized}` otherwise.\n- `Lightning.Policies.Permissions.can?(policy, action, actor, resource)` returns `true` if the actor can perform the action on the resource and `false` otherwise.\n\nHere is an example of how we the `Lightning.Policies.Permissions.can/4` interface to check if the a user can edit a job or not\n```elixir\ncan_edit_workflow = Lightning.Policies.ProjectUsers |> Lightning.Policies.Permissions.can?(:edit_workflow, socket.assigns.current_user, socket.assigns.project)\n\nif can_edit_workflow do\n # allow user to edit the workflow\nelse\n # quick user out\nend\n```","ref":"Lightning.Policies.Permissions.html"},{"type":"function","title":"Lightning.Policies.Permissions.can/4","doc":"checks if user has the permissions to apply action using some policy module\n\nReturns `:ok` if user can apply action and `{:error, :unauthorized}` otherwise","ref":"Lightning.Policies.Permissions.html#can/4"},{"type":"function","title":"Examples - Lightning.Policies.Permissions.can/4","doc":"iex> can(Lightning.Policies.Users, :create_workflow, user, project)\n :ok\n\n iex> can(Lightning.Policies.Users, :create_project, user, %{})\n {:error, :unauthorized}","ref":"Lightning.Policies.Permissions.html#can/4-examples"},{"type":"function","title":"Lightning.Policies.Permissions.can?/4","doc":"same as can/4 but returns `true` if user can apply action and `false` otherwise","ref":"Lightning.Policies.Permissions.html#can?/4"},{"type":"function","title":"Examples - Lightning.Policies.Permissions.can?/4","doc":"iex> can(Lightning.Policies.Users, :create_workflow, user, project)\n true\n\n iex> can(Lightning.Policies.Users, :create_project, user, %{})\n false","ref":"Lightning.Policies.Permissions.html#can?/4-examples"},{"type":"module","title":"Lightning.Policies.ProjectUsers","doc":"The Bodyguard Policy module for projects members roles.","ref":"Lightning.Policies.ProjectUsers.html"},{"type":"function","title":"Lightning.Policies.ProjectUsers.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role\nfor this project and returns `true` if the user can perform the action in\nthat project and `false` if they cannot.\n\nNote that permissions are grouped by action, rather than by user role.\n\nWe deny by default, so if a user's role is not added to the allow roles list\nfor a particular action they are denied.","ref":"Lightning.Policies.ProjectUsers.html#authorize/3"},{"type":"type","title":"Lightning.Policies.ProjectUsers.actions/0","doc":"","ref":"Lightning.Policies.ProjectUsers.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Provisioning","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Provisioning.html"},{"type":"function","title":"Lightning.Policies.Provisioning.authorize/3","doc":"authorize/3 takes an action, a user or a project repo connection, and a project. It checks the user's role\nfor this project and returns `true` if the user can perform the action and\nfalse if they cannot.\n\nNote that permissions are grouped by action.\n\nWe deny by default, so if a user's role is not added to the allow roles list\nfor a particular action they are denied.\n\nOnly a superuser can provision a new project.\n\nOwners and admins can update existing projects.","ref":"Lightning.Policies.Provisioning.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Provisioning.actions/0","doc":"","ref":"Lightning.Policies.Provisioning.html#t:actions/0"},{"type":"module","title":"Lightning.Policies.Users","doc":"The Bodyguard Policy module for users roles.","ref":"Lightning.Policies.Users.html"},{"type":"function","title":"Lightning.Policies.Users.authorize/3","doc":"authorize/3 takes an action, a user, and a project. It checks the user's role\nfor this project and returns `true` if the user can perform the action and\nfalse if they cannot.\n\nNote that permissions are grouped by action.\n\nWe deny by default, so if a user's role is not added to the allow roles list\nfor a particular action they are denied.","ref":"Lightning.Policies.Users.html#authorize/3"},{"type":"type","title":"Lightning.Policies.Users.actions/0","doc":"","ref":"Lightning.Policies.Users.html#t:actions/0"},{"type":"module","title":"Lightning.PromEx","doc":"Be sure to add the following to finish setting up PromEx:\n\n1. Update your configuration (config.exs, dev.exs, prod.exs, releases.exs, etc) to\n configure the necessary bit of PromEx. Be sure to check out `PromEx.Config` for\n more details regarding configuring PromEx:\n ```\n config :lightning, Lightning.PromEx,\n disabled: false,\n manual_metrics_start_delay: :no_delay,\n drop_metrics_groups: [],\n grafana: :disabled,\n metrics_server: :disabled\n ```\n\n2. Add this module to your application supervision tree. It should be one of the first\n things that is started so that no Telemetry events are missed. For example, if PromEx\n is started after your Repo module, you will miss Ecto's init events and the dashboards\n will be missing some data points:\n ```\n def start(_type, _args) do\n children = [\n Lightning.PromEx,\n\n ...\n ]\n\n ...\n end\n ```\n\n3. Update your `endpoint.ex` file to expose your metrics (or configure a standalone\n server using the `:metrics_server` config options). Be sure to put this plug before\n your `Plug.Telemetry` entry so that you can avoid having calls to your `/metrics`\n endpoint create their own metrics and logs which can pollute your logs/metrics given\n that Prometheus will scrape at a regular interval and that can get noisy:\n ```\n defmodule LightningWeb.Endpoint do\n use Phoenix.Endpoint, otp_app: :lightning\n\n ...\n\n plug PromEx.Plug, prom_ex_module: Lightning.PromEx\n\n ...\n end\n ```\n\n4. Update the list of plugins in the `plugins/0` function return list to reflect your\n application's dependencies. Also update the list of dashboards that are to be uploaded\n to Grafana in the `dashboards/0` function.","ref":"Lightning.PromEx.html"},{"type":"function","title":"Lightning.PromEx.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.PromEx.html#child_spec/1"},{"type":"module","title":"Lightning.Release","doc":"Used for executing DB release tasks when run in production without Mix\ninstalled.","ref":"Lightning.Release.html"},{"type":"function","title":"Lightning.Release.create_db/0","doc":"","ref":"Lightning.Release.html#create_db/0"},{"type":"function","title":"Lightning.Release.load_app/0","doc":"","ref":"Lightning.Release.html#load_app/0"},{"type":"function","title":"Lightning.Release.migrate/0","doc":"","ref":"Lightning.Release.html#migrate/0"},{"type":"function","title":"Lightning.Release.rollback/2","doc":"","ref":"Lightning.Release.html#rollback/2"},{"type":"module","title":"Lightning.Repo","doc":"","ref":"Lightning.Repo.html"},{"type":"function","title":"Lightning.Repo.aggregate/3","doc":"","ref":"Lightning.Repo.html#aggregate/3"},{"type":"function","title":"Lightning.Repo.aggregate/4","doc":"","ref":"Lightning.Repo.html#aggregate/4"},{"type":"function","title":"Lightning.Repo.all/2","doc":"","ref":"Lightning.Repo.html#all/2"},{"type":"function","title":"Lightning.Repo.checked_out?/0","doc":"","ref":"Lightning.Repo.html#checked_out?/0"},{"type":"function","title":"Lightning.Repo.checkout/2","doc":"","ref":"Lightning.Repo.html#checkout/2"},{"type":"function","title":"Lightning.Repo.child_spec/1","doc":"","ref":"Lightning.Repo.html#child_spec/1"},{"type":"function","title":"Lightning.Repo.config/0","doc":"","ref":"Lightning.Repo.html#config/0"},{"type":"function","title":"Lightning.Repo.default_options/1","doc":"","ref":"Lightning.Repo.html#default_options/1"},{"type":"function","title":"Lightning.Repo.delete/2","doc":"","ref":"Lightning.Repo.html#delete/2"},{"type":"function","title":"Lightning.Repo.delete!/2","doc":"","ref":"Lightning.Repo.html#delete!/2"},{"type":"function","title":"Lightning.Repo.delete_all/2","doc":"","ref":"Lightning.Repo.html#delete_all/2"},{"type":"function","title":"Lightning.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Lightning.Repo.html#disconnect_all/2"},{"type":"function","title":"Lightning.Repo.exists?/2","doc":"","ref":"Lightning.Repo.html#exists?/2"},{"type":"function","title":"Lightning.Repo.explain/3","doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar\ndepending on the adapter to obtain statistics for the given query.\n\nSee `Ecto.Adapters.SQL.explain/4` for more information.","ref":"Lightning.Repo.html#explain/3"},{"type":"function","title":"Lightning.Repo.get/3","doc":"","ref":"Lightning.Repo.html#get/3"},{"type":"function","title":"Lightning.Repo.get!/3","doc":"","ref":"Lightning.Repo.html#get!/3"},{"type":"function","title":"Lightning.Repo.get_by/3","doc":"","ref":"Lightning.Repo.html#get_by/3"},{"type":"function","title":"Lightning.Repo.get_by!/3","doc":"","ref":"Lightning.Repo.html#get_by!/3"},{"type":"function","title":"Lightning.Repo.get_dynamic_repo/0","doc":"","ref":"Lightning.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Lightning.Repo.in_transaction?/0","doc":"","ref":"Lightning.Repo.html#in_transaction?/0"},{"type":"function","title":"Lightning.Repo.insert/2","doc":"","ref":"Lightning.Repo.html#insert/2"},{"type":"function","title":"Lightning.Repo.insert!/2","doc":"","ref":"Lightning.Repo.html#insert!/2"},{"type":"function","title":"Lightning.Repo.insert_all/3","doc":"","ref":"Lightning.Repo.html#insert_all/3"},{"type":"function","title":"Lightning.Repo.insert_or_update/2","doc":"","ref":"Lightning.Repo.html#insert_or_update/2"},{"type":"function","title":"Lightning.Repo.insert_or_update!/2","doc":"","ref":"Lightning.Repo.html#insert_or_update!/2"},{"type":"function","title":"Lightning.Repo.load/2","doc":"","ref":"Lightning.Repo.html#load/2"},{"type":"function","title":"Lightning.Repo.one/2","doc":"","ref":"Lightning.Repo.html#one/2"},{"type":"function","title":"Lightning.Repo.one!/2","doc":"","ref":"Lightning.Repo.html#one!/2"},{"type":"function","title":"Lightning.Repo.paginate/2","doc":"","ref":"Lightning.Repo.html#paginate/2"},{"type":"function","title":"Lightning.Repo.preload/3","doc":"","ref":"Lightning.Repo.html#preload/3"},{"type":"function","title":"Lightning.Repo.prepare_query/3","doc":"","ref":"Lightning.Repo.html#prepare_query/3"},{"type":"function","title":"Lightning.Repo.put_dynamic_repo/1","doc":"","ref":"Lightning.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Lightning.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Lightning.Repo.html#query/3"},{"type":"function","title":"Lightning.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Lightning.Repo.html#query!/3"},{"type":"function","title":"Lightning.Repo.query_many/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many/4` for more information.","ref":"Lightning.Repo.html#query_many/3"},{"type":"function","title":"Lightning.Repo.query_many!/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many!/4` for more information.","ref":"Lightning.Repo.html#query_many!/3"},{"type":"function","title":"Lightning.Repo.reload/2","doc":"","ref":"Lightning.Repo.html#reload/2"},{"type":"function","title":"Lightning.Repo.reload!/2","doc":"","ref":"Lightning.Repo.html#reload!/2"},{"type":"function","title":"Lightning.Repo.rollback/1","doc":"","ref":"Lightning.Repo.html#rollback/1"},{"type":"function","title":"Lightning.Repo.scrivener_defaults/0","doc":"","ref":"Lightning.Repo.html#scrivener_defaults/0"},{"type":"function","title":"Lightning.Repo.start_link/1","doc":"","ref":"Lightning.Repo.html#start_link/1"},{"type":"function","title":"Lightning.Repo.stop/1","doc":"","ref":"Lightning.Repo.html#stop/1"},{"type":"function","title":"Lightning.Repo.stream/2","doc":"","ref":"Lightning.Repo.html#stream/2"},{"type":"function","title":"Lightning.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Lightning.Repo.html#to_sql/2"},{"type":"function","title":"Lightning.Repo.transact/2","doc":"A small wrapper around `Repo.transaction/2`.\n\nCommits the transaction if the lambda returns `:ok` or `{:ok, result}`,\nrolling it back if the lambda returns `:error` or `{:error, reason}`. In both\ncases, the function returns the result of the lambda.\n\nExample:\n\n Repo.transact(fn ->\n with {:ok, user} <- Accounts.create_user(params),\n {:ok, _log} <- Logs.log_action(:user_registered, user),\n {:ok, _job} <- Mailer.enqueue_email_confirmation(user) do\n {:ok, user}\n end\n end)\n\nFrom blog post found [here](https://tomkonidas.com/repo-transact/)","ref":"Lightning.Repo.html#transact/2"},{"type":"function","title":"Lightning.Repo.transaction/2","doc":"","ref":"Lightning.Repo.html#transaction/2"},{"type":"function","title":"Lightning.Repo.update/2","doc":"","ref":"Lightning.Repo.html#update/2"},{"type":"function","title":"Lightning.Repo.update!/2","doc":"","ref":"Lightning.Repo.html#update!/2"},{"type":"function","title":"Lightning.Repo.update_all/3","doc":"","ref":"Lightning.Repo.html#update_all/3"},{"type":"module","title":"Lightning.Run","doc":"Ecto model for Runs.","ref":"Lightning.Run.html"},{"type":"function","title":"Lightning.Run.add_options/2","doc":"Adds options (project-level logging options, resource limits such as timeout\nand memory usage, etc.) to the run before storing in the DB.","ref":"Lightning.Run.html#add_options/2"},{"type":"function","title":"Lightning.Run.complete/2","doc":"","ref":"Lightning.Run.html#complete/2"},{"type":"macro","title":"Lightning.Run.final_states/0","doc":"Returns the list of final states for a run.","ref":"Lightning.Run.html#final_states/0"},{"type":"function","title":"Lightning.Run.for/2","doc":"","ref":"Lightning.Run.html#for/2"},{"type":"function","title":"Lightning.Run.new/1","doc":"","ref":"Lightning.Run.html#new/1"},{"type":"function","title":"Lightning.Run.start/2","doc":"","ref":"Lightning.Run.html#start/2"},{"type":"type","title":"Lightning.Run.t/0","doc":"","ref":"Lightning.Run.html#t:t/0"},{"type":"module","title":"Lightning.RunStep","doc":"Ecto model for an the Steps in a Run.","ref":"Lightning.RunStep.html"},{"type":"function","title":"Lightning.RunStep.new/1","doc":"","ref":"Lightning.RunStep.html#new/1"},{"type":"function","title":"Lightning.RunStep.new/2","doc":"","ref":"Lightning.RunStep.html#new/2"},{"type":"type","title":"Lightning.RunStep.t/0","doc":"","ref":"Lightning.RunStep.html#t:t/0"},{"type":"module","title":"Lightning.SafetyString","doc":"Utilities for securely encoding serializable structs, lists and strings into\nURL-safe strings.\n\nIn order to pass the state around in a URL, in a manner that protects\nsecrets from leaking - and allows us to avoid persistance\nwe take a set of parameters and:\n\n- Encode into a URI query string\n- gzip it to save characters\n- encrypt the string\n- base64 encode it for URI encoding safety","ref":"Lightning.SafetyString.html"},{"type":"function","title":"Lightning.SafetyString.decode/1","doc":"","ref":"Lightning.SafetyString.html#decode/1"},{"type":"function","title":"Lightning.SafetyString.encode/1","doc":"","ref":"Lightning.SafetyString.html#encode/1"},{"type":"module","title":"Lightning.Schema","doc":"Defines the database schema and primary key type for Thunderbolt schemas.","ref":"Lightning.Schema.html"},{"type":"module","title":"Lightning.Scrubber","doc":"Process used to scrub strings of sensitive information.\n\nCan be started via `start_link/1`.\n\n```\n{:ok, scrubber} =\n Lightning.Scrubber.start_link(\n samples:\n Lightning.Credentials.sensitive_values_for(credential)\n )\n```\n\nTakes an optional `:name` key, in case you need to name the process.","ref":"Lightning.Scrubber.html"},{"type":"function","title":"Lightning.Scrubber.add_samples/3","doc":"","ref":"Lightning.Scrubber.html#add_samples/3"},{"type":"function","title":"Lightning.Scrubber.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Scrubber.html#child_spec/1"},{"type":"function","title":"Lightning.Scrubber.encode_samples/2","doc":"Prepare a list of sensitive samples (strings) into a potentially bigger list\ncomposed of variations a sample may appear.","ref":"Lightning.Scrubber.html#encode_samples/2"},{"type":"function","title":"Lightning.Scrubber.samples/1","doc":"","ref":"Lightning.Scrubber.html#samples/1"},{"type":"function","title":"Lightning.Scrubber.scrub/2","doc":"","ref":"Lightning.Scrubber.html#scrub/2"},{"type":"function","title":"Lightning.Scrubber.start_link/1","doc":"","ref":"Lightning.Scrubber.html#start_link/1"},{"type":"module","title":"Lightning.Services.AccountHook","doc":"Allows handling user creation or registration atomically without relying on async events.","ref":"Lightning.Services.AccountHook.html"},{"type":"function","title":"Lightning.Services.AccountHook.handle_create_user/1","doc":"","ref":"Lightning.Services.AccountHook.html#handle_create_user/1"},{"type":"function","title":"Lightning.Services.AccountHook.handle_register_superuser/1","doc":"","ref":"Lightning.Services.AccountHook.html#handle_register_superuser/1"},{"type":"function","title":"Lightning.Services.AccountHook.handle_register_user/1","doc":"","ref":"Lightning.Services.AccountHook.html#handle_register_user/1"},{"type":"module","title":"Lightning.Services.AdapterHelper","doc":"Maps the module to be used for the extension service.","ref":"Lightning.Services.AdapterHelper.html"},{"type":"function","title":"Lightning.Services.AdapterHelper.adapter/1","doc":"","ref":"Lightning.Services.AdapterHelper.html#adapter/1"},{"type":"module","title":"Lightning.Services.ProjectHook","doc":"Allows handling project creation atomically without relying on async events.","ref":"Lightning.Services.ProjectHook.html"},{"type":"function","title":"Lightning.Services.ProjectHook.handle_create_project/1","doc":"","ref":"Lightning.Services.ProjectHook.html#handle_create_project/1"},{"type":"function","title":"Lightning.Services.ProjectHook.handle_delete_project/1","doc":"","ref":"Lightning.Services.ProjectHook.html#handle_delete_project/1"},{"type":"module","title":"Lightning.Services.RateLimiter","doc":"Adapter to call the extension for rate limiting.","ref":"Lightning.Services.RateLimiter.html"},{"type":"module","title":"Lightning.Services.RunQueue","doc":"Adapter to call the extension for selecting Runtime workloads.","ref":"Lightning.Services.RunQueue.html"},{"type":"module","title":"Lightning.Services.UsageLimiter","doc":"Adapter to call the extension for limiting Runtime workloads.","ref":"Lightning.Services.UsageLimiter.html"},{"type":"module","title":"Lightning.Setup","doc":"Demo encapsulates logic for setting up a demonstration site.","ref":"Lightning.Setup.html"},{"type":"function","title":"Lightning.Setup.ensure_minimum_setup/0","doc":"Set up the bare minimum so that commands can be executed against the repo.","ref":"Lightning.Setup.html#ensure_minimum_setup/0"},{"type":"function","title":"Lightning.Setup.setup_user/3","doc":"This makes it possible to run setup_user as an external command\n\nSee: Lightning.SetupUtils.setup_user() for more docs.","ref":"Lightning.Setup.html#setup_user/3"},{"type":"function","title":"Examples - Lightning.Setup.setup_user/3","doc":"iex> kubectl exec -it deploy/demo-web -- /app/bin/lightning eval Lightning.Setup.setup_user(%{email: \"td@openfn.org\", first_name: \"taylor\", last_name: \"downs\", password: \"shh12345!\"})\n :ok","ref":"Lightning.Setup.html#setup_user/3-examples"},{"type":"module","title":"Lightning.SetupUtils","doc":"SetupUtils encapsulates logic for setting up initial data for various sites.","ref":"Lightning.SetupUtils.html"},{"type":"function","title":"Lightning.SetupUtils.confirm_users/1","doc":"","ref":"Lightning.SetupUtils.html#confirm_users/1"},{"type":"function","title":"Lightning.SetupUtils.create_dhis2_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_dhis2_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_openhie_project/1","doc":"","ref":"Lightning.SetupUtils.html#create_openhie_project/1"},{"type":"function","title":"Lightning.SetupUtils.create_starter_project/2","doc":"","ref":"Lightning.SetupUtils.html#create_starter_project/2"},{"type":"function","title":"Lightning.SetupUtils.create_users/1","doc":"","ref":"Lightning.SetupUtils.html#create_users/1"},{"type":"function","title":"Lightning.SetupUtils.setup_demo/1","doc":"Creates initial data and returns the created records.","ref":"Lightning.SetupUtils.html#setup_demo/1"},{"type":"function","title":"Lightning.SetupUtils.setup_user/3","doc":"In some (mostly remote-controlled) deployments, it's necessary to create a\nuser, and apiToken, and multiple credentials (owned by the user) so that later\n`openfn deploy` calls can make use of these artifacts.\n\nWhen run _before_ `openfn deploy`, this function makes it possible to set up\nan entire lightning instance with a working project (including secrets)\nwithout using the web UI.","ref":"Lightning.SetupUtils.html#setup_user/3"},{"type":"function","title":"Examples - Lightning.SetupUtils.setup_user/3","doc":"iex> setup_user(%{email: \"td@openfn.org\", first_name: \"taylor\", last_name: \"downs\", password: \"shh12345!\"}, \"secretToken\", [%{name: \"openmrs\", schema: \"raw\", body: %{\"a\" => \"secret\"}}, %{ name: \"dhis2\", schema: \"raw\", body: %{\"b\" => \"safe\"}}])\n :ok","ref":"Lightning.SetupUtils.html#setup_user/3-examples"},{"type":"function","title":"Lightning.SetupUtils.tear_down/1","doc":"","ref":"Lightning.SetupUtils.html#tear_down/1"},{"type":"module","title":"Lightning.SetupUtils.Ticker","doc":"Time ticker to assure time progress/sequence specially for multiple logs.","ref":"Lightning.SetupUtils.Ticker.html"},{"type":"function","title":"Lightning.SetupUtils.Ticker.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.SetupUtils.Ticker.html#child_spec/1"},{"type":"function","title":"Lightning.SetupUtils.Ticker.next/1","doc":"","ref":"Lightning.SetupUtils.Ticker.html#next/1"},{"type":"function","title":"Lightning.SetupUtils.Ticker.start_link/1","doc":"","ref":"Lightning.SetupUtils.Ticker.html#start_link/1"},{"type":"function","title":"Lightning.SetupUtils.Ticker.stop/1","doc":"","ref":"Lightning.SetupUtils.Ticker.html#stop/1"},{"type":"module","title":"Lightning.Storage","doc":"The external storage module.\n\nThis module is responsible for storing and retrieving files from the\nconfigured storage backend.","ref":"Lightning.Storage.html"},{"type":"behaviour","title":"Lightning.Storage.Backend","doc":"The behaviour for storage backends.","ref":"Lightning.Storage.Backend.html"},{"type":"callback","title":"Lightning.Storage.Backend.get_url/1","doc":"","ref":"Lightning.Storage.Backend.html#c:get_url/1"},{"type":"callback","title":"Lightning.Storage.Backend.store/2","doc":"","ref":"Lightning.Storage.Backend.html#c:store/2"},{"type":"module","title":"Lightning.Storage.GCS","doc":"A storage backend module for handling file storage in Google Cloud Storage (GCS).\n\nIt implements the `Lightning.Storage.Backend` behaviour to manage file storage operations in Google Cloud Storage. This includes storing files to GCS buckets and generating signed URLs for secure access to the stored files.","ref":"Lightning.Storage.GCS.html"},{"type":"module","title":"Responsibilities - Lightning.Storage.GCS","doc":"- **Storing Files**: The `store/2` function uploads files from a local source path to a specified destination path within a GCS bucket.\n- **Generating Signed URLs**: The `get_url/1` function generates a signed URL for accessing a file stored in GCS. This signed URL is valid for a limited time (default 1 hour).\n- **Configuration**: The module relies on application configuration to determine the GCS bucket and Google API connection settings.","ref":"Lightning.Storage.GCS.html#module-responsibilities"},{"type":"module","title":"Example Usage - Lightning.Storage.GCS","doc":"```elixir\n# Store a file in GCS\nLightning.Storage.GCS.store(\"/path/to/source\", \"destination/path\")\n\n# Get a signed URL for the stored file\n{:ok, url} = Lightning.Storage.GCS.get_url(\"destination/path\")\n```","ref":"Lightning.Storage.GCS.html#module-example-usage"},{"type":"module","title":"Lightning.Storage.Local","doc":"A storage backend module for handling local file storage.\n\nIt implements the `Lightning.Storage.Backend` behaviour to manage file storage\noperations on the local file system. This includes storing files from a source\npath to a destination path and generating URLs for accessing stored files.","ref":"Lightning.Storage.Local.html"},{"type":"module","title":"Responsibilities - Lightning.Storage.Local","doc":"- **Storing Files**: The `store/2` function is responsible for copying files\n from a given source path to a specified destination path on the local file\n system.\n- **Generating URLs**: The `get_url/1` function generates a `file://` URL for\n accessing a stored file locally.\n- **Configuration**: The module relies on application configuration to\n determine the root directory for storage operations.","ref":"Lightning.Storage.Local.html#module-responsibilities"},{"type":"module","title":"Example Usage - Lightning.Storage.Local","doc":"```elixir\n# Store a file\n{:ok, filename} =\n Lightning.Storage.Local.store(\"/path/to/source\", \"destination/path\")\n\n# Get the URL for the stored file\n{:ok, url} = Lightning.Storage.Local.get_url(\"destination/path\")\n```","ref":"Lightning.Storage.Local.html#module-example-usage"},{"type":"module","title":"Lightning.Storage.ProjectFileDefinition","doc":"This module provides functionality for managing the storage and retrieval of project files.\n\n It handles operations related to storing project files, generating URLs for accessing these files, and constructing storage paths for exported files. It serves as an abstraction layer over the underlying storage mechanism provided by the `Lightning.Storage` module.","ref":"Lightning.Storage.ProjectFileDefinition.html"},{"type":"module","title":"Functions - Lightning.Storage.ProjectFileDefinition","doc":"- `store/2`: Stores a file from a given source path into the storage system based on the file's path.\n - `get_url/1`: Retrieves the URL for accessing a stored file.\n - `storage_path_for_exports/2`: Constructs a storage path for exported files, defaulting to a `.zip` extension.","ref":"Lightning.Storage.ProjectFileDefinition.html#module-functions"},{"type":"module","title":"Example Usage - Lightning.Storage.ProjectFileDefinition","doc":"```elixir\n # Store a file\n Lightning.Storage.ProjectFileDefinition.store(\"/path/to/source\", project_file)\n\n # Get a URL for the stored file\n url = Lightning.Storage.ProjectFileDefinition.get_url(project_file)\n\n # Get the storage path for an exported file\n path = Lightning.Storage.ProjectFileDefinition.storage_path_for_exports(project_file)\n ```","ref":"Lightning.Storage.ProjectFileDefinition.html#module-example-usage"},{"type":"function","title":"Lightning.Storage.ProjectFileDefinition.get_url/1","doc":"","ref":"Lightning.Storage.ProjectFileDefinition.html#get_url/1"},{"type":"function","title":"Lightning.Storage.ProjectFileDefinition.storage_path_for_exports/2","doc":"","ref":"Lightning.Storage.ProjectFileDefinition.html#storage_path_for_exports/2"},{"type":"function","title":"Lightning.Storage.ProjectFileDefinition.store/2","doc":"","ref":"Lightning.Storage.ProjectFileDefinition.html#store/2"},{"type":"module","title":"Lightning.TaskWorker","doc":"A TaskWorker with concurrency limits.\n\nA simple concurrency limiter that wraps `Task.Supervisor`, which already does\nhave the ability to specify `max_children`; it throws an error when\nthat limit is exceeded.\n\nTo use it, start it like any other process; ideally in your supervision tree.\n\n```\n ...,\n {Lightning.TaskWorker, name: :cli_task_worker, max_tasks: 4}\n```\n\n**Options**\n\n- `:max_tasks` Defaults to the number of system schedulers available to the vm.","ref":"Lightning.TaskWorker.html"},{"type":"function","title":"Lightning.TaskWorker.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.TaskWorker.html#child_spec/1"},{"type":"function","title":"Lightning.TaskWorker.get_status/1","doc":"","ref":"Lightning.TaskWorker.html#get_status/1"},{"type":"function","title":"Lightning.TaskWorker.start_link/1","doc":"","ref":"Lightning.TaskWorker.html#start_link/1"},{"type":"function","title":"Lightning.TaskWorker.start_task/2","doc":"","ref":"Lightning.TaskWorker.html#start_task/2"},{"type":"module","title":"Lightning.UsageTracking","doc":"The UsageTracking context.","ref":"Lightning.UsageTracking.html"},{"type":"function","title":"Lightning.UsageTracking.disable_daily_report/0","doc":"","ref":"Lightning.UsageTracking.html#disable_daily_report/0"},{"type":"function","title":"Lightning.UsageTracking.enable_daily_report/1","doc":"","ref":"Lightning.UsageTracking.html#enable_daily_report/1"},{"type":"function","title":"Lightning.UsageTracking.enqueue_reports/3","doc":"","ref":"Lightning.UsageTracking.html#enqueue_reports/3"},{"type":"function","title":"Lightning.UsageTracking.find_enabled_daily_report_config/0","doc":"","ref":"Lightning.UsageTracking.html#find_enabled_daily_report_config/0"},{"type":"function","title":"Lightning.UsageTracking.insert_report/3","doc":"","ref":"Lightning.UsageTracking.html#insert_report/3"},{"type":"function","title":"Lightning.UsageTracking.lightning_version/0","doc":"","ref":"Lightning.UsageTracking.html#lightning_version/0"},{"type":"function","title":"Lightning.UsageTracking.reportable_dates/3","doc":"","ref":"Lightning.UsageTracking.html#reportable_dates/3"},{"type":"function","title":"Lightning.UsageTracking.start_reporting_after/1","doc":"","ref":"Lightning.UsageTracking.html#start_reporting_after/1"},{"type":"function","title":"Lightning.UsageTracking.submit_report/2","doc":"","ref":"Lightning.UsageTracking.html#submit_report/2"},{"type":"function","title":"Lightning.UsageTracking.update_report_submission!/2","doc":"","ref":"Lightning.UsageTracking.html#update_report_submission!/2"},{"type":"module","title":"Lightning.UsageTracking.Client","doc":"Client for Usage Tracker service","ref":"Lightning.UsageTracking.Client.html"},{"type":"function","title":"Lightning.UsageTracking.Client.reachable?/1","doc":"","ref":"Lightning.UsageTracking.Client.html#reachable?/1"},{"type":"function","title":"Lightning.UsageTracking.Client.submit_metrics/2","doc":"","ref":"Lightning.UsageTracking.Client.html#submit_metrics/2"},{"type":"module","title":"Lightning.UsageTracking.DailyReportConfiguration","doc":"Configuration for the creation of daily reports","ref":"Lightning.UsageTracking.DailyReportConfiguration.html"},{"type":"function","title":"Lightning.UsageTracking.DailyReportConfiguration.changeset/2","doc":"","ref":"Lightning.UsageTracking.DailyReportConfiguration.html#changeset/2"},{"type":"module","title":"Lightning.UsageTracking.DayWorker","doc":"Worker to manage per-day report generation","ref":"Lightning.UsageTracking.DayWorker.html"},{"type":"module","title":"Lightning.UsageTracking.GithubClient","doc":"A github client to make unauthenticated HTTP requests to Github.","ref":"Lightning.UsageTracking.GithubClient.html"},{"type":"function","title":"Lightning.UsageTracking.GithubClient.build_client/1","doc":"","ref":"Lightning.UsageTracking.GithubClient.html#build_client/1"},{"type":"function","title":"Lightning.UsageTracking.GithubClient.open_fn_commit?/1","doc":"","ref":"Lightning.UsageTracking.GithubClient.html#open_fn_commit?/1"},{"type":"module","title":"Lightning.UsageTracking.ProjectMetricsService","doc":"Builds project-related metrics.","ref":"Lightning.UsageTracking.ProjectMetricsService.html"},{"type":"function","title":"Lightning.UsageTracking.ProjectMetricsService.find_eligible_projects/1","doc":"","ref":"Lightning.UsageTracking.ProjectMetricsService.html#find_eligible_projects/1"},{"type":"function","title":"Lightning.UsageTracking.ProjectMetricsService.generate_metrics/3","doc":"","ref":"Lightning.UsageTracking.ProjectMetricsService.html#generate_metrics/3"},{"type":"module","title":"Lightning.UsageTracking.Report","doc":"Report submitted to Usage Tracker","ref":"Lightning.UsageTracking.Report.html"},{"type":"function","title":"Lightning.UsageTracking.Report.changeset/2","doc":"","ref":"Lightning.UsageTracking.Report.html#changeset/2"},{"type":"module","title":"Lightning.UsageTracking.ReportData","doc":"Builds data set for submission to Usage Tracker","ref":"Lightning.UsageTracking.ReportData.html"},{"type":"function","title":"Lightning.UsageTracking.ReportData.generate/3","doc":"","ref":"Lightning.UsageTracking.ReportData.html#generate/3"},{"type":"module","title":"Lightning.UsageTracking.ReportWorker","doc":"Worker to generate report for given day","ref":"Lightning.UsageTracking.ReportWorker.html"},{"type":"module","title":"Lightning.UsageTracking.ResponseProcessor","doc":"Utility module to abstract dealing with some of the Tesla plumbing","ref":"Lightning.UsageTracking.ResponseProcessor.html"},{"type":"function","title":"Lightning.UsageTracking.ResponseProcessor.successful?/1","doc":"","ref":"Lightning.UsageTracking.ResponseProcessor.html#successful?/1"},{"type":"function","title":"Lightning.UsageTracking.ResponseProcessor.successful_200?/1","doc":"","ref":"Lightning.UsageTracking.ResponseProcessor.html#successful_200?/1"},{"type":"module","title":"Lightning.UsageTracking.ResubmissionCandidatesWorker","doc":"Worker to find reports that have failed submissions and enqueue jobs to\nreprocess them.","ref":"Lightning.UsageTracking.ResubmissionCandidatesWorker.html"},{"type":"module","title":"Lightning.UsageTracking.ResubmissionWorker","doc":"Worker to resubmit report that has failed submission.","ref":"Lightning.UsageTracking.ResubmissionWorker.html"},{"type":"module","title":"Lightning.UsageTracking.RunService","doc":"Supports the generation of metrics related to runs and steps.","ref":"Lightning.UsageTracking.RunService.html"},{"type":"function","title":"Lightning.UsageTracking.RunService.finished_runs/2","doc":"","ref":"Lightning.UsageTracking.RunService.html#finished_runs/2"},{"type":"function","title":"Lightning.UsageTracking.RunService.finished_steps/2","doc":"","ref":"Lightning.UsageTracking.RunService.html#finished_steps/2"},{"type":"function","title":"Lightning.UsageTracking.RunService.unique_job_ids/2","doc":"","ref":"Lightning.UsageTracking.RunService.html#unique_job_ids/2"},{"type":"module","title":"Lightning.UsageTracking.UserQueries","doc":"Contains queries used to determine user-related metrics.","ref":"Lightning.UsageTracking.UserQueries.html"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.active_users/1","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#active_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.active_users/2","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#active_users/2"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.existing_users/1","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#existing_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserQueries.existing_users/2","doc":"","ref":"Lightning.UsageTracking.UserQueries.html#existing_users/2"},{"type":"module","title":"Lightning.UsageTracking.UserService","doc":"Returns counts for the various user-related metrics.","ref":"Lightning.UsageTracking.UserService.html"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_active_users/1","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_active_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_active_users/2","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_active_users/2"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_users/1","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_users/1"},{"type":"function","title":"Lightning.UsageTracking.UserService.no_of_users/2","doc":"","ref":"Lightning.UsageTracking.UserService.html#no_of_users/2"},{"type":"module","title":"Lightning.UsageTracking.WorkflowMetricsService","doc":"Builds workflow-related metrics.","ref":"Lightning.UsageTracking.WorkflowMetricsService.html"},{"type":"function","title":"Lightning.UsageTracking.WorkflowMetricsService.find_eligible_workflows/2","doc":"","ref":"Lightning.UsageTracking.WorkflowMetricsService.html#find_eligible_workflows/2"},{"type":"function","title":"Lightning.UsageTracking.WorkflowMetricsService.generate_metrics/3","doc":"","ref":"Lightning.UsageTracking.WorkflowMetricsService.html#generate_metrics/3"},{"type":"module","title":"Lightning.Validators","doc":"Extra validators for Ecto.Changeset.","ref":"Lightning.Validators.html"},{"type":"function","title":"Lightning.Validators.validate_exclusive/3","doc":"Validate that only one of the fields is set at a time.\n\nExample:\n\n```\nchangeset\n|> validate_exclusive(\n [:source_job_id, :source_trigger_id],\n \"source_job_id and source_trigger_id are mutually exclusive\"\n)\n```","ref":"Lightning.Validators.html#validate_exclusive/3"},{"type":"function","title":"Lightning.Validators.validate_one_required/3","doc":"Validate that at least one of the fields is set.","ref":"Lightning.Validators.html#validate_one_required/3"},{"type":"function","title":"Lightning.Validators.validate_required_assoc/3","doc":"Validate that an association is present\n\n> **NOTE**\n> This should only be used when using `put_assoc`, not `cast_assoc`.\n> `cast_assoc` provides a `required: true` option.\n> Unlike `validate_required`, this does not add the field to the `required`\n> list in the schema.","ref":"Lightning.Validators.html#validate_required_assoc/3"},{"type":"function","title":"Lightning.Validators.validate_url/2","doc":"Validate that a field is a valid URL.","ref":"Lightning.Validators.html#validate_url/2"},{"type":"module","title":"Lightning.Vault","doc":"Module for handling the encryption and decryption of database fields.","ref":"Lightning.Vault.html"},{"type":"function","title":"Lightning.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Lightning.Vault.html#child_spec/1"},{"type":"function","title":"Lightning.Vault.start_link/1","doc":"","ref":"Lightning.Vault.html#start_link/1"},{"type":"module","title":"Lightning.VersionControl","doc":"Boundary module for handling Version control activities for project, jobs\nworkflows etc\nUse this module to create, modify and delete connections as well\nas running any associated sync jobs","ref":"Lightning.VersionControl.html"},{"type":"function","title":"Lightning.VersionControl.create_github_connection/2","doc":"Creates a connection between a project and a github repo","ref":"Lightning.VersionControl.html#create_github_connection/2"},{"type":"function","title":"Lightning.VersionControl.delete_github_oauth_grant/1","doc":"Deletes the authorization for the github app and updates the user details accordingly","ref":"Lightning.VersionControl.html#delete_github_oauth_grant/1"},{"type":"function","title":"Lightning.VersionControl.exchange_code_for_oauth_token/1","doc":"Fetches the oauth access token using the code received from the callback url\nFor more info: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-user-access-token-for-a-github-app","ref":"Lightning.VersionControl.html#exchange_code_for_oauth_token/1"},{"type":"function","title":"Lightning.VersionControl.fetch_installation_repos/1","doc":"","ref":"Lightning.VersionControl.html#fetch_installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.fetch_repo_branches/2","doc":"","ref":"Lightning.VersionControl.html#fetch_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.fetch_user_access_token/1","doc":"Fecthes the access token for the given `User`.\nIf the access token has expired, it `refreshes` the token and updates the `User` column accordingly","ref":"Lightning.VersionControl.html#fetch_user_access_token/1"},{"type":"function","title":"Lightning.VersionControl.fetch_user_installations/1","doc":"","ref":"Lightning.VersionControl.html#fetch_user_installations/1"},{"type":"function","title":"Lightning.VersionControl.get_repo_connection_for_project/1","doc":"","ref":"Lightning.VersionControl.html#get_repo_connection_for_project/1"},{"type":"function","title":"Lightning.VersionControl.get_repo_connection_for_token/1","doc":"","ref":"Lightning.VersionControl.html#get_repo_connection_for_token/1"},{"type":"function","title":"Lightning.VersionControl.github_enabled?/0","doc":"","ref":"Lightning.VersionControl.html#github_enabled?/0"},{"type":"function","title":"Lightning.VersionControl.initiate_sync/2","doc":"","ref":"Lightning.VersionControl.html#initiate_sync/2"},{"type":"function","title":"Lightning.VersionControl.oauth_token_valid?/1","doc":"Checks if the given token has expired.\nGithub supports access tokens that expire and those that don't.\nIf the `access token` expires, then a `refresh token` is also availed.\nThis function simply checks if the token has a `refresh_token`, if yes, it proceeds to check the expiry date","ref":"Lightning.VersionControl.html#oauth_token_valid?/1"},{"type":"function","title":"Lightning.VersionControl.reconfigure_github_connection/3","doc":"","ref":"Lightning.VersionControl.html#reconfigure_github_connection/3"},{"type":"function","title":"Lightning.VersionControl.refresh_oauth_token/1","doc":"Fetches a new access token using the given refresh token\nFor more info: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/refreshing-user-access-tokens","ref":"Lightning.VersionControl.html#refresh_oauth_token/1"},{"type":"function","title":"Lightning.VersionControl.remove_github_connection/2","doc":"Deletes a github connection","ref":"Lightning.VersionControl.html#remove_github_connection/2"},{"type":"function","title":"Lightning.VersionControl.save_oauth_token/3","doc":"","ref":"Lightning.VersionControl.html#save_oauth_token/3"},{"type":"function","title":"Lightning.VersionControl.subscribe/1","doc":"","ref":"Lightning.VersionControl.html#subscribe/1"},{"type":"function","title":"Lightning.VersionControl.verify_github_connection/1","doc":"","ref":"Lightning.VersionControl.html#verify_github_connection/1"},{"type":"module","title":"Lightning.VersionControl.Events","doc":"","ref":"Lightning.VersionControl.Events.html"},{"type":"function","title":"Lightning.VersionControl.Events.oauth_token_added/1","doc":"","ref":"Lightning.VersionControl.Events.html#oauth_token_added/1"},{"type":"function","title":"Lightning.VersionControl.Events.oauth_token_failed/2","doc":"","ref":"Lightning.VersionControl.Events.html#oauth_token_failed/2"},{"type":"function","title":"Lightning.VersionControl.Events.subscribe/1","doc":"","ref":"Lightning.VersionControl.Events.html#subscribe/1"},{"type":"module","title":"Lightning.VersionControl.GithubClient","doc":"Tesla github http client we use this to make any network requests\nto github from Lightning","ref":"Lightning.VersionControl.GithubClient.html"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_basic_auth_client/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_basic_auth_client/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_bearer_client/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_bearer_client/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_installation_client/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_installation_client/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.build_oauth_client/0","doc":"","ref":"Lightning.VersionControl.GithubClient.html#build_oauth_client/0"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_blob/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_blob/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_commit/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_commit/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_ref/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_ref/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_repo_dispatch_event/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_repo_dispatch_event/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_repo_secret/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_repo_secret/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_tree/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_tree/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.create_workflow_dispatch_event/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#create_workflow_dispatch_event/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete/3","doc":"Perform a DELETE request.\n\nSee `request/1` or `request/2` for options definition.\n\n delete(\"/users\")\n delete(\"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\")\n delete(client, \"/users\", query: [scope: \"admin\"])\n delete(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#delete/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete!/3","doc":"Perform a DELETE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n delete!(\"/users\")\n delete!(\"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\")\n delete!(client, \"/users\", query: [scope: \"admin\"])\n delete!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#delete!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_app_grant/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_app_grant/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_ref/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_ref/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_repo_content/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_repo_content/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.delete_repo_secret/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#delete_repo_secret/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#get/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#get!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_commit/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_commit/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_installation_repos/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_installation_repos/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_installations/1","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_installations/1"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_branches/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_branches/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_content/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_content/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_public_key/2","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_public_key/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.get_repo_secret/3","doc":"","ref":"Lightning.VersionControl.GithubClient.html#get_repo_secret/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#head/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#head!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#options/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#options!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#patch/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#patch!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post/4","doc":"Perform a POST request.\n\nSee `request/1` or `request/2` for options definition.\n\n post(\"/users\", %{name: \"Jon\"})\n post(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post(client, \"/users\", %{name: \"Jon\"})\n post(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#post/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.post!/4","doc":"Perform a POST request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n post!(\"/users\", %{name: \"Jon\"})\n post!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n post!(client, \"/users\", %{name: \"Jon\"})\n post!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#post!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put/4","doc":"Perform a PUT request.\n\nSee `request/1` or `request/2` for options definition.\n\n put(\"/users\", %{name: \"Jon\"})\n put(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put(client, \"/users\", %{name: \"Jon\"})\n put(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#put/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.put!/4","doc":"Perform a PUT request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n put!(\"/users\", %{name: \"Jon\"})\n put!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n put!(client, \"/users\", %{name: \"Jon\"})\n put!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Lightning.VersionControl.GithubClient.html#put!/4"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request/2","doc":"Perform a request.","ref":"Lightning.VersionControl.GithubClient.html#request/2"},{"type":"function","title":"Options - Lightning.VersionControl.GithubClient.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"Lightning.VersionControl.GithubClient.html#request/2-options"},{"type":"function","title":"Examples - Lightning.VersionControl.GithubClient.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#request/2-examples"},{"type":"function","title":"Lightning.VersionControl.GithubClient.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"Lightning.VersionControl.GithubClient.html#request!/2"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#trace/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Lightning.VersionControl.GithubClient.html#trace!/3"},{"type":"function","title":"Lightning.VersionControl.GithubClient.update_ref/4","doc":"","ref":"Lightning.VersionControl.GithubClient.html#update_ref/4"},{"type":"type","title":"Lightning.VersionControl.GithubClient.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"Lightning.VersionControl.GithubClient.html#t:option/0"},{"type":"exception","title":"Lightning.VersionControl.GithubError","doc":"GitHub Error exception","ref":"Lightning.VersionControl.GithubError.html"},{"type":"function","title":"Lightning.VersionControl.GithubError.api_error/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#api_error/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.file_not_found/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#file_not_found/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.installation_not_found/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#installation_not_found/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.invalid_certificate/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#invalid_certificate/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.invalid_oauth_token/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#invalid_oauth_token/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.misconfigured/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#misconfigured/2"},{"type":"function","title":"Lightning.VersionControl.GithubError.new/3","doc":"","ref":"Lightning.VersionControl.GithubError.html#new/3"},{"type":"function","title":"Lightning.VersionControl.GithubError.repo_secret_not_found/2","doc":"","ref":"Lightning.VersionControl.GithubError.html#repo_secret_not_found/2"},{"type":"type","title":"Lightning.VersionControl.GithubError.t/0","doc":"","ref":"Lightning.VersionControl.GithubError.html#t:t/0"},{"type":"module","title":"Lightning.VersionControl.GithubToken","doc":"A module that `uses` Joken to handle building and signing application\ntokens for communicating with github\n\nSee: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-json-web-token-jwt-for-a-github-app#about-json-web-tokens-jwts","ref":"Lightning.VersionControl.GithubToken.html"},{"type":"function","title":"Lightning.VersionControl.GithubToken.build/2","doc":"","ref":"Lightning.VersionControl.GithubToken.html#build/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.VersionControl.GithubToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.VersionControl.GithubToken.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.VersionControl.GithubToken.html#verify_and_validate!/3"},{"type":"module","title":"Lightning.VersionControl.ProjectRepoConnection","doc":"Ecto model for project repo connections","ref":"Lightning.VersionControl.ProjectRepoConnection.html"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#changeset/2"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.config_path/1","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#config_path/1"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.configure_changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#configure_changeset/2"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.create_changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#create_changeset/2"},{"type":"function","title":"Lightning.VersionControl.ProjectRepoConnection.reconfigure_changeset/2","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#reconfigure_changeset/2"},{"type":"type","title":"Lightning.VersionControl.ProjectRepoConnection.t/0","doc":"","ref":"Lightning.VersionControl.ProjectRepoConnection.html#t:t/0"},{"type":"module","title":"Lightning.WebhookAuthMethods","doc":"Provides functionality for managing webhook authentication methods.\n\nThis module contains functions to create, update, list, and delete authentication methods\nfor webhooks. It supports operations such as scheduling authentication methods for deletion,\npurging them, associating them with triggers, and handling their life cycle within the system.\n\nThe main responsibilities of this module include:\n\n- Creating new webhook authentication methods with `create_auth_method/2`.\n- Associating and disassociating authentication methods with triggers.\n- Updating existing webhook authentication methods with `update_auth_method/3`.\n- Listing webhook authentication methods for a given project or trigger.\n- Finding a webhook authentication method by various identifiers, like API key or username and password.\n- Scheduling webhook authentication methods for deletion and purging them accordingly.","ref":"Lightning.WebhookAuthMethods.html"},{"type":"function","title":"Lightning.WebhookAuthMethods.create_auth_method/2","doc":"Creates a new `WebhookAuthMethod` and associated audit records.\n\nThis function supports creating a `WebhookAuthMethod` either standalone or associated with a `Trigger`. It performs a database transaction that includes creating the auth method and its audit trail.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- `attrs`: A map of attributes used to create the `WebhookAuthMethod`.\n - `actor`: The user performing the action, provided as a `%User{}` struct.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-parameters"},{"type":"function","title":"Overloads - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- When called with a map of attributes, it creates a `WebhookAuthMethod` without associating it to a trigger.\n - When called with a `Trigger` struct and a map of attributes, it creates a `WebhookAuthMethod` and associates it with the provided trigger.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-overloads"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- `{:ok, %WebhookAuthMethod{}}`: A tuple containing `:ok` and the newly created `WebhookAuthMethod` struct if the creation was successful.\n - `{:error, %Ecto.Changeset{}}`: A tuple containing `:error` and the changeset with errors if the creation failed.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- Creating a `WebhookAuthMethod` without an associated trigger:\n\n ```elixir\n iex> create_auth_method(%{valid_attributes}, actor: %User{})\n {:ok, %WebhookAuthMethod{}}\n\n iex> create_auth_method(%{invalid_attributes}, actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```\n\n - Creating a `WebhookAuthMethod` with an associated trigger:\n\n ```elixir\n iex> create_auth_method(%Trigger{}, %{valid_attributes}, actor: %User{})\n {:ok, %WebhookAuthMethod{}}\n\n iex> create_auth_method(%Trigger{}, %{invalid_attributes}, actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.create_auth_method/2","doc":"- This function starts a `Repo.transaction` to ensure that all database operations are atomic. If any part of the transaction fails, all changes will be rolled back.\n - Audit events are created for both the creation of the `WebhookAuthMethod` and its association with a trigger, if applicable.","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/2-notes"},{"type":"function","title":"Lightning.WebhookAuthMethods.create_auth_method/3","doc":"","ref":"Lightning.WebhookAuthMethods.html#create_auth_method/3"},{"type":"function","title":"Lightning.WebhookAuthMethods.create_changeset/2","doc":"Creates a changeset for a `WebhookAuthMethod` struct, which can include special handling based on the authentication type.\n\nThis function prepares a changeset for the creation or update of a `WebhookAuthMethod`. If the `auth_type` is `:api`, it generates a new API key and includes it in the returned structure.","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.create_changeset/2","doc":"- `webhook_auth_method`: The `WebhookAuthMethod` struct to be updated.\n - `params`: A map containing the parameters with which to update the `webhook_auth_method`.","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.create_changeset/2","doc":"- Returns the updated `WebhookAuthMethod` struct with changes applied. If `auth_type` is `:api`, an API key is generated and included.","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.create_changeset/2","doc":"- Creating a changeset for an API type auth method:\n\n ```elixir\n iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :api}, %{})\n %WebhookAuthMethod{api_key: some_new_api_key}\n ```\n\n - Creating a changeset for a non-API type auth method:\n\n ```elixir\n iex> Lightning.Workflows.create_changeset(%WebhookAuthMethod{auth_type: :other}, %{})\n %WebhookAuthMethod{}\n ```","ref":"Lightning.WebhookAuthMethods.html#create_changeset/2-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"Deletes a given `WebhookAuthMethod` from the database.\n\nThe function takes a `WebhookAuthMethod` struct and runs to delete it. If the deletion is successful, it returns an `:ok` tuple with the deleted `WebhookAuthMethod` struct. If the deletion fails due to a constraint, such as a foreign key reference, it returns an error tuple.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- `auth_method`: The `WebhookAuthMethod` struct to delete.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- `{:ok, struct}`: A tuple containing `:ok` and the deleted `WebhookAuthMethod` struct if the deletion succeeds.\n - `{:error, reason}`: A tuple containing `:error` and the reason for failure if the deletion fails.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- Successful deletion:\n\n ```elixir\n iex> delete_auth_method(%WebhookAuthMethod{id: \"some_id\"})\n {:ok, %WebhookAuthMethod{}}\n ```\n\n - Deletion fails due to the item not existing or other conflict:\n\n ```elixir\n iex> delete_auth_method(%WebhookAuthMethod{id: \"non_existing_id\"})\n {:error, reason}\n ```","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.delete_auth_method/1","doc":"- It is important to ensure that the `WebhookAuthMethod` is not being referenced by other entities before trying deletion to avoid conflicts.\n - This function will return an error tuple if the `WebhookAuthMethod` struct passed to it does not exist in the database.","ref":"Lightning.WebhookAuthMethods.html#delete_auth_method/1-notes"},{"type":"function","title":"Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"Retrieves a `WebhookAuthMethod` that matches the given API key for a specified project.\n\nIt uses a secure comparison to match the API key, ensuring that timing attacks are mitigated.","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"- `api_key`: The API key as a binary string to match against existing `WebhookAuthMethod` records.\n - `project`: The `Project` struct to scope the search within its associated `WebhookAuthMethod`s.","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"- A `WebhookAuthMethod` struct if a matching API key is found within the given project's scope.\n - `nil` if there is no `WebhookAuthMethod` with the given API key for the project.","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.find_by_api_key/2","doc":"- When a matching `WebhookAuthMethod` is found:\n\n ```elixir\n iex> Lightning.Workflows.find_by_api_key(\"existing_api_key\", %Project{id: \"existing_project_id\"})\n %WebhookAuthMethod{}\n ```\n\n - When there is no matching `WebhookAuthMethod`:\n\n ```elixir\n iex> Lightning.Workflows.find_by_api_key(\"non_existing_api_key\", %Project{id: \"existing_project_id\"})\n nil\n ```","ref":"Lightning.WebhookAuthMethods.html#find_by_api_key/2-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.find_by_id!/1","doc":"Retrieves a `WebhookAuthMethod` by its ID, raising an exception if not found.\n\nThis function is intended for situations where the `WebhookAuthMethod` is expected to exist, and not finding one is an exceptional case that should halt normal flow with an error.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1"},{"type":"function","title":"Parameter - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- `id`: The ID of the `WebhookAuthMethod` to retrieve.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-parameter"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- Returns the `WebhookAuthMethod` struct if found.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-returns"},{"type":"function","title":"Errors - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- Raises `Ecto.NoResultsError` if there is no `WebhookAuthMethod` with the given ID.","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-errors"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.find_by_id!/1","doc":"- When a `WebhookAuthMethod` with the given ID exists:\n\n ```elixir\n iex> Lightning.Workflows.find_by_id!(\"existing_id\")\n %WebhookAuthMethod{}\n ```\n\n - When there is no `WebhookAuthMethod` with the given ID:\n\n ```elixir\n iex> Lightning.Workflows.find_by_id!(\"non_existing_id\")\n ** (Ecto.NoResultsError)\n ```","ref":"Lightning.WebhookAuthMethods.html#find_by_id!/1-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"Retrieves a `WebhookAuthMethod` that matches the given username and password within the scope of a specified project.\n\nThe function checks if the provided password is correct for the given username and project. If the password is valid, the corresponding `WebhookAuthMethod` is returned. It is important to handle password comparison securely to prevent timing attacks.","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"- `username`: The username as a string to match against the `WebhookAuthMethod` records.\n - `password`: The plaintext password as a string which will be securely compared to the stored password.\n - `project`: The `Project` struct to scope the search for the `WebhookAuthMethod`.","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"- Returns the matching `WebhookAuthMethod` struct if the username and password are correct within the given project's scope.\n - Returns `nil` if no matching record is found or if the password is invalid.","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.find_by_username_and_password/3","doc":"- When a matching `WebhookAuthMethod` is found and the password is valid:\n\n ```elixir\n iex> Lightning.Workflows.find_by_username_and_password(\"existing_username\", \"valid_password\", %Project{id: \"existing_project_id\"})\n %WebhookAuthMethod{}\n ```\n\n - When the username is found but the password is invalid or no matching record is found:\n\n ```elixir\n iex> Lightning.Workflows.find_by_username_and_password(\"existing_username\", \"invalid_password\", %Project{id: \"existing_project_id\"})\n nil\n ```","ref":"Lightning.WebhookAuthMethods.html#find_by_username_and_password/3-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.list_for_project/1","doc":"Retrieves a list of `WebhookAuthMethod`s associated with a specific `Project`.\n\nThe function filters `WebhookAuthMethod`s by the provided `Project`'s ID and excludes any methods that are scheduled for deletion.","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.list_for_project/1","doc":"- `project`: The `Project` struct containing the ID of the project for which to list the authentication methods.","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.list_for_project/1","doc":"- A list of `WebhookAuthMethod` structs. This can be an empty list if no methods are associated with the project or if the project does not exist.","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.list_for_project/1","doc":"- When the project exists and has associated auth methods:\n\n ```elixir\n iex> list_for_project(%Project{id: \"existing_project_id\"})\n [%WebhookAuthMethod{}, ...]\n ```\n\n - When the project does not exist or has no associated auth methods:\n\n ```elixir\n iex> list_for_project(%Project{id: \"non_existing_project_id\"})\n []\n ```","ref":"Lightning.WebhookAuthMethods.html#list_for_project/1-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"Retrieves a list of `WebhookAuthMethod`s associated with the specified `Trigger`.\n\nThis function filters out `WebhookAuthMethod`s that are scheduled for deletion, ensuring that only active methods are returned.","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"- `trigger`: A `Trigger` struct whose associated `WebhookAuthMethod`s are to be retrieved.","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"- A list of `WebhookAuthMethod` structs associated with the `Trigger`. If the `Trigger` has no associated methods or if they are all scheduled for deletion, the list will be empty.","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.list_for_trigger/1","doc":"- When the `Trigger` has associated `WebhookAuthMethod`s not scheduled for deletion:\n\n ```elixir\n iex> Lightning.Workflows.list_for_trigger(%Trigger{id: \"existing_trigger_id\"})\n [%WebhookAuthMethod{}, ...]\n ```\n\n - When the `Trigger` has no associated `WebhookAuthMethod`s or they are all scheduled for deletion:\n\n ```elixir\n iex> Lightning.Workflows.list_for_trigger(%Trigger{id: \"trigger_without_methods\"})\n []\n ```","ref":"Lightning.WebhookAuthMethods.html#list_for_trigger/1-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.perform/1","doc":"Performs cleanup of `WebhookAuthMethod` records that are marked for permanent deletion.","ref":"Lightning.WebhookAuthMethods.html#perform/1"},{"type":"function","title":"Details - Lightning.WebhookAuthMethods.perform/1","doc":"This function, when invoked with a job argument containing `%{\"type\" => \"purge_deleted\"}`, performs the following operations:\n\n1. It queries all `WebhookAuthMethod` records that are scheduled for deletion (i.e., their `scheduled_deletion` timestamp is in the past).\n2. It then disassociates each of these records from any associated triggers.\n3. Finally, it deletes the `WebhookAuthMethod` records from the database.\n\nThe function operates within the context of an Oban job, utilizing the `perform/1` callback expected by the Oban.Worker behaviour.","ref":"Lightning.WebhookAuthMethods.html#perform/1-details"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.perform/1","doc":"- A `%Oban.Job{args: %{\"type\" => \"purge_deleted\"}}` struct, indicating the job should perform a purge operation.","ref":"Lightning.WebhookAuthMethods.html#perform/1-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.perform/1","doc":"A tuple `{:ok, %{disassociated_count: integer(), deleted_count: integer()}}` where:\n- `:ok` indicates the operation was successful.\n- `disassociated_count` is the number of `WebhookAuthMethod` records successfully disassociated from triggers.\n- `deleted_count` is the number of `WebhookAuthMethod` records successfully deleted.","ref":"Lightning.WebhookAuthMethods.html#perform/1-returns"},{"type":"function","title":"Example - Lightning.WebhookAuthMethods.perform/1","doc":"```elixir\n%Oban.Job{\nargs: %{\"type\" => \"purge_deleted\"}\n}\n|> MyModule.perform()\n# => {:ok, %{disassociated_count: 2, deleted_count: 2}}\n```","ref":"Lightning.WebhookAuthMethods.html#perform/1-example"},{"type":"function","title":"Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"Schedules a `WebhookAuthMethod` for deletion by setting its `scheduled_deletion` date.\n\nThis function does not delete the record immediately. Instead, it sets the `scheduled_deletion` field to a date in the future as defined by the application's environment settings.\nThe default behavior, in the absence of environment configuration, is to schedule the deletion for the current date and time, effectively marking it for immediate deletion.\n\nThe scheduled deletion date is determined by the `:purge_deleted_after_days` configuration in the application environment.\nIf this configuration is not present, the function defaults to 0 days, which schedules the deletion for the current date and time.","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"- `webhook_auth_method`: A `WebhookAuthMethod` struct that is to be scheduled for deletion.","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"- `{:ok, webhook_auth_method}`: Returns an `:ok` tuple with the updated webhook auth method struct if the\n update was successful.\n - `{:error, changeset}`: Returns an `:error` tuple with the changeset if the update failed.","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.schedule_for_deletion/2","doc":"- When a webhook auth method is successfully scheduled for deletion:\n\n ```elixir\n iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{id: some_id})\n {:ok, %WebhookAuthMethod{scheduled_deletion: deletion_date}}\n ```\n\n - When scheduling for deletion fails due to validation errors:\n\n ```elixir\n iex> Lightning.Workflows.schedule_for_deletion(%WebhookAuthMethod{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#schedule_for_deletion/2-examples"},{"type":"function","title":"Lightning.WebhookAuthMethods.update_auth_method/3","doc":"Updates an existing `WebhookAuthMethod` with the provided attributes and creates an audit event.\n\nThis function applies the given changes to the specified `WebhookAuthMethod` and records the update action in the audit log. It wraps the operations within a database transaction to ensure data integrity.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- `webhook_auth_method`: The `WebhookAuthMethod` struct to be updated.\n - `attrs`: A map containing the updated values for the fields of the `WebhookAuthMethod`.\n - `actor`: The user performing the update, represented by a `%User{}` struct.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- `{:ok, %WebhookAuthMethod{}}`: A tuple containing `:ok` and the updated `WebhookAuthMethod` struct if the update is successful.\n - `{:error, %Ecto.Changeset{}}`: A tuple containing `:error` and the changeset with errors if the update fails.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- Successful update:\n\n ```elixir\n iex> update_auth_method(webhook_auth_method, %{field: new_value}, actor: %User{})\n {:ok, %WebhookAuthMethod{}}\n ```\n\n - Update fails due to invalid data:\n\n ```elixir\n iex> update_auth_method(webhook_auth_method, %{field: bad_value}, actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.update_auth_method/3","doc":"- The function uses `Ecto.Multi` to perform a transaction, ensuring that either all changes apply successfully, or none do if there's an error.\n - An audit event is recorded with the `Lightning.WebhookAuthMethodAudit.event/4` function, capturing the details of the update and the acting user.","ref":"Lightning.WebhookAuthMethods.html#update_auth_method/3-notes"},{"type":"function","title":"Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"Updates the association of `WebhookAuthMethod`s for a given `Trigger` and logs the changes as audit events.\n\nThis function replaces the current `WebhookAuthMethod` associations of a `Trigger` with the provided list of `WebhookAuthMethod`s. It creates audit events for each added and removed `WebhookAuthMethod`, ensuring full traceability of changes.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3"},{"type":"function","title":"Parameters - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- `trigger`: The `Trigger` struct whose associated `WebhookAuthMethod`s are to be updated.\n - `auth_methods`: A list of `WebhookAuthMethod` structs to be associated with the `Trigger`.\n - `actor`: The user performing the update, represented by a `%User{}` struct.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-parameters"},{"type":"function","title":"Returns - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- `{:ok, %Trigger{}}`: A tuple containing `:ok` and the updated `Trigger` struct if the associations are updated successfully.\n - `{:error, %Ecto.Changeset{}}`: A tuple containing `:error` and the changeset with errors if the update fails.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-returns"},{"type":"function","title":"Examples - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- Successful association update:\n\n ```elixir\n iex> update_trigger_auth_methods(trigger, [webhook_auth_method], actor: %User{})\n {:ok, %Trigger{}}\n ```\n\n - Update fails due to an invalid changeset:\n\n ```elixir\n iex> update_trigger_auth_methods(trigger, [invalid_webhook_auth_method], actor: %User{})\n {:error, %Ecto.Changeset{}}\n ```","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-examples"},{"type":"function","title":"Notes - Lightning.WebhookAuthMethods.update_trigger_auth_methods/3","doc":"- The function uses `Ecto.Multi` to perform a transaction, which ensures either all changes are applied or none at all if an error occurs.\n - Audit events for the additions and removals of `WebhookAuthMethod`s are recorded using `WebhookAuthMethodAudit.event/4`.\n - The function preloads the existing `webhook_auth_methods` of the `Trigger` before performing updates.","ref":"Lightning.WebhookAuthMethods.html#update_trigger_auth_methods/3-notes"},{"type":"module","title":"Lightning.WorkOrder","doc":"Ecto model for WorkOrders.","ref":"Lightning.WorkOrder.html"},{"type":"function","title":"Lightning.WorkOrder.validate/1","doc":"","ref":"Lightning.WorkOrder.html#validate/1"},{"type":"type","title":"Lightning.WorkOrder.t/0","doc":"","ref":"Lightning.WorkOrder.html#t:t/0"},{"type":"module","title":"Lightning.Workers","doc":"Lightning uses external worker processes to execute workflow jobs.\n\nThis module deals with the security tokens and the formatting used on\nthe communication with the workers.","ref":"Lightning.Workers.html"},{"type":"function","title":"Lightning.Workers.generate_run_token/2","doc":"","ref":"Lightning.Workers.html#generate_run_token/2"},{"type":"function","title":"Lightning.Workers.verify_run_token/2","doc":"Verifies and validates a run token.\n\nIt requires a context map with the following keys:\n\n- `:id` - the run id that the token was issued with.\n\nOptionally takes a context map that will be passed to the validation:\n\n- `:current_time` - the current time as a `DateTime` struct.","ref":"Lightning.Workers.html#verify_run_token/2"},{"type":"function","title":"Lightning.Workers.verify_worker_token/2","doc":"Verifies and validates a worker token.\n\nOptionally takes a context map that will be passed to the validation:\n\n- `:current_time` - the current time as a `DateTime` struct.","ref":"Lightning.Workers.html#verify_worker_token/2"},{"type":"module","title":"Lightning.Workers.RunToken","doc":"JWT token configuration to verify if workers work is legit.","ref":"Lightning.Workers.RunToken.html"},{"type":"function","title":"Lightning.Workers.RunToken.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.Workers.RunToken.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Workers.RunToken.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.Workers.RunToken.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Workers.RunToken.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.Workers.RunToken.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Workers.RunToken.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.Workers.RunToken.html#verify_and_validate!/3"},{"type":"module","title":"Lightning.Workers.Token","doc":"JWT token configuration to authenticate workers.","ref":"Lightning.Workers.Token.html"},{"type":"function","title":"Lightning.Workers.Token.generate_and_sign/2","doc":"Combines `generate_claims/1` and `encode_and_sign/2`","ref":"Lightning.Workers.Token.html#generate_and_sign/2"},{"type":"function","title":"Lightning.Workers.Token.generate_and_sign!/2","doc":"Same as `generate_and_sign/2` but raises if error","ref":"Lightning.Workers.Token.html#generate_and_sign!/2"},{"type":"function","title":"Lightning.Workers.Token.verify_and_validate/3","doc":"Combines `verify/2` and `validate/2`","ref":"Lightning.Workers.Token.html#verify_and_validate/3"},{"type":"function","title":"Lightning.Workers.Token.verify_and_validate!/3","doc":"Same as `verify_and_validate/2` but raises if error","ref":"Lightning.Workers.Token.html#verify_and_validate!/3"},{"type":"task","title":"mix lightning.gen_encryption_key","doc":"Helper to generate a unique encryption key for Vault","ref":"Mix.Tasks.Lightning.GenEncryptionKey.html"},{"type":"task","title":"mix lightning.gen_worker_keys","doc":"Helper to generate the private and public keys for worker authentication","ref":"Mix.Tasks.Lightning.GenWorkerKeys.html"},{"type":"task","title":"mix lightning.install_adaptor_icons","doc":"Installs the adaptor icons","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.get/3","doc":"Perform a GET request.\n\nSee `request/1` or `request/2` for options definition.\n\n get(\"/users\")\n get(\"/users\", query: [scope: \"admin\"])\n get(client, \"/users\")\n get(client, \"/users\", query: [scope: \"admin\"])\n get(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#get/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.get!/3","doc":"Perform a GET request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n get!(\"/users\")\n get!(\"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\")\n get!(client, \"/users\", query: [scope: \"admin\"])\n get!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#get!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.head/3","doc":"Perform a HEAD request.\n\nSee `request/1` or `request/2` for options definition.\n\n head(\"/users\")\n head(\"/users\", query: [scope: \"admin\"])\n head(client, \"/users\")\n head(client, \"/users\", query: [scope: \"admin\"])\n head(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#head/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.head!/3","doc":"Perform a HEAD request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n head!(\"/users\")\n head!(\"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\")\n head!(client, \"/users\", query: [scope: \"admin\"])\n head!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#head!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.options/3","doc":"Perform a OPTIONS request.\n\nSee `request/1` or `request/2` for options definition.\n\n options(\"/users\")\n options(\"/users\", query: [scope: \"admin\"])\n options(client, \"/users\")\n options(client, \"/users\", query: [scope: \"admin\"])\n options(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#options/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.options!/3","doc":"Perform a OPTIONS request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n options!(\"/users\")\n options!(\"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\")\n options!(client, \"/users\", query: [scope: \"admin\"])\n options!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#options!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.patch/4","doc":"Perform a PATCH request.\n\nSee `request/1` or `request/2` for options definition.\n\n patch(\"/users\", %{name: \"Jon\"})\n patch(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch(client, \"/users\", %{name: \"Jon\"})\n patch(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#patch/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.patch!/4","doc":"Perform a PATCH request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n patch!(\"/users\", %{name: \"Jon\"})\n patch!(\"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])\n patch!(client, \"/users\", %{name: \"Jon\"})\n patch!(client, \"/users\", %{name: \"Jon\"}, query: [scope: \"admin\"])","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#patch!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.request/2","doc":"Perform a request.","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request/2"},{"type":"function","title":"Options - Mix.Tasks.Lightning.InstallAdaptorIcons.request/2","doc":"- `:method` - the request method, one of [`:head`, `:get`, `:delete`, `:trace`, `:options`, `:post`, `:put`, `:patch`]\n- `:url` - either full url e.g. \"http://example.com/some/path\" or just \"/some/path\" if using `Tesla.Middleware.BaseUrl`\n- `:query` - a keyword list of query params, e.g. `[page: 1, per_page: 100]`\n- `:headers` - a keyworld list of headers, e.g. `[{\"content-type\", \"text/plain\"}]`\n- `:body` - depends on used middleware:\n - by default it can be a binary\n - if using e.g. JSON encoding middleware it can be a nested map\n - if adapter supports it it can be a Stream with any of the above\n- `:opts` - custom, per-request middleware or adapter options","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request/2-options"},{"type":"function","title":"Examples - Mix.Tasks.Lightning.InstallAdaptorIcons.request/2","doc":"ExampleApi.request(method: :get, url: \"/users/path\")\n\n # use shortcut methods\n ExampleApi.get(\"/users/1\")\n ExampleApi.post(client, \"/users\", %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request/2-examples"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.request!/2","doc":"Perform request and raise in case of error.\n\nThis is similar to `request/2` behaviour from Tesla 0.x\n\nSee `request/2` for list of available options.","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#request!/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.trace/3","doc":"Perform a TRACE request.\n\nSee `request/1` or `request/2` for options definition.\n\n trace(\"/users\")\n trace(\"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\")\n trace(client, \"/users\", query: [scope: \"admin\"])\n trace(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#trace/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.trace!/3","doc":"Perform a TRACE request.\n\nSee `request!/1` or `request!/2` for options definition.\n\n trace!(\"/users\")\n trace!(\"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\")\n trace!(client, \"/users\", query: [scope: \"admin\"])\n trace!(client, \"/users\", body: %{name: \"Jon\"})","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#trace!/3"},{"type":"type","title":"Mix.Tasks.Lightning.InstallAdaptorIcons.option/0","doc":"Options that may be passed to a request function. See `request/2` for detailed descriptions.","ref":"Mix.Tasks.Lightning.InstallAdaptorIcons.html#t:option/0"},{"type":"task","title":"mix lightning.install_runtime","doc":"Installs the following NodeJS packages:\n\n- core\n- language-common","ref":"Mix.Tasks.Lightning.InstallRuntime.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.packages/0","doc":"","ref":"Mix.Tasks.Lightning.InstallRuntime.html#packages/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallRuntime.run/1","doc":"","ref":"Mix.Tasks.Lightning.InstallRuntime.html#run/1"},{"type":"task","title":"mix lightning.install_schemas","doc":"Install the credential json schemas\nUse --exclude language-package1, language-package2 to exclude specific packages","ref":"Mix.Tasks.Lightning.InstallSchemas.html"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete/3","doc":"Issues a DELETE request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.delete!/3","doc":"Issues a DELETE request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#delete!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.fetch_schemas/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#fetch_schemas/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get/3","doc":"Issues a GET request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.get!/3","doc":"Issues a GET request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#get!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head/3","doc":"Issues a HEAD request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.head!/3","doc":"Issues a HEAD request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#head!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options/3","doc":"Issues an OPTIONS request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.options!/3","doc":"Issues a OPTIONS request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#options!/3"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.parse_excluded/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#parse_excluded/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch/4","doc":"Issues a PATCH request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.patch!/4","doc":"Issues a PATCH request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#patch!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.persist_schema/2","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#persist_schema/2"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post/4","doc":"Issues a POST request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.post!/4","doc":"Issues a POST request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#post!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_headers/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_body/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_headers/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_options/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_options/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_params/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_params/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_request_url/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_request_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_body/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_body/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_chunk/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_chunk/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_headers/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_headers/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_response_status_code/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_response_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_status_code/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_status_code/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.process_url/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#process_url/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put/4","doc":"Issues a PUT request to the given url.\n\nReturns `{:ok, response}` if the request is successful, `{:error, reason}`\notherwise.\n\nSee `request/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.put!/4","doc":"Issues a PUT request to the given url, raising an exception in case of\nfailure.\n\nIf the request does not fail, the response is returned.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#put!/4"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"Issues an HTTP request using an `HTTPoison.Request` struct.\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1"},{"type":"function","title":"Redirect handling - Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1-redirect-handling"},{"type":"function","title":"Examples - Mix.Tasks.Lightning.InstallSchemas.request/1","doc":"request = %HTTPoison.Request{\n method: :post,\n url: \"https://my.website.com\",\n body: \"{\\\"foo\\\": 3}\",\n headers: [{\"Accept\", \"application/json\"}]\n }\n\n request(request)","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/1-examples"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"Issues an HTTP request with the given method to the given url.\n\nThis function is usually used indirectly by `get/3`, `post/4`, `put/4`, etc\n\nArgs:\n * `method` - HTTP method as an atom (`:get`, `:head`, `:post`, `:put`,\n `:delete`, etc.)\n * `url` - target url as a binary string or char list\n * `body` - request body. See more below\n * `headers` - HTTP headers as an orddict (e.g., `[{\"Accept\", \"application/json\"}]`)\n * `options` - Keyword list of options\n\nBody: see type `HTTPoison.Request`\n\nOptions: see type `HTTPoison.Request`\n\nThis function returns `{:ok, response}`, `{:ok, async_response}`, or `{:ok, maybe_redirect}`\nif the request is successful, `{:error, reason}` otherwise.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5"},{"type":"function","title":"Redirect handling - Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"If the option `:follow_redirect` is given, HTTP redirects are automatically follow if\nthe method is set to `:get` or `:head` and the response's `status_code` is `301`, `302` or\n`307`.\n\nIf the method is set to `:post`, then the only `status_code` that get's automatically\nfollowed is `303`.\n\nIf any other method or `status_code` is returned, then this function returns a\nreturns a `{:ok, %HTTPoison.MaybeRedirect{}}` containing the `redirect_url` for you to\nre-request with the method set to `:get`.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5-redirect-handling"},{"type":"function","title":"Examples - Mix.Tasks.Lightning.InstallSchemas.request/5","doc":"request(:post, \"https://my.website.com\", \"{\\\"foo\\\": 3}\", [{\"Accept\", \"application/json\"}])","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request/5-examples"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request!/1","doc":"Issues an HTTP request an `HTTPoison.Request` struct.\nexception in case of failure.\n\n`request!/1` works exactly like `request/1` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request!/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.request!/5","doc":"Issues an HTTP request with the given method to the given url, raising an\nexception in case of failure.\n\n`request!/5` works exactly like `request/5` but it returns just the\nresponse in case of a successful request, raising an exception in case the\nrequest fails.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#request!/5"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.run/1","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#run/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.start/0","doc":"Starts HTTPoison and its dependencies.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#start/0"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.stream_next/1","doc":"Requests the next message to be streamed for a given `HTTPoison.AsyncResponse`.\n\nSee `request!/5` for more detailed information.","ref":"Mix.Tasks.Lightning.InstallSchemas.html#stream_next/1"},{"type":"function","title":"Mix.Tasks.Lightning.InstallSchemas.write_schema/3","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#write_schema/3"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.body/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:body/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.headers/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:headers/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.method/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:method/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.options/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:options/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.params/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:params/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.request/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:request/0"},{"type":"type","title":"Mix.Tasks.Lightning.InstallSchemas.url/0","doc":"","ref":"Mix.Tasks.Lightning.InstallSchemas.html#t:url/0"},{"type":"extras","title":"Lightning","doc":"# OpenFn/Lightning [![CircleCI](https://dl.circleci.com/status-badge/img/gh/OpenFn/lightning/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/OpenFn/lightning/tree/main) [![codecov](https://codecov.io/gh/OpenFn/lightning/branch/main/graph/badge.svg?token=FfDMxdGL3a)](https://codecov.io/gh/OpenFn/lightning) ![Docker Pulls](https://img.shields.io/docker/pulls/openfn/lightning)\n\nLightning ⚡ (aka \"OpenFn v2\") is a workflow automation platform that's used to\nautomate critical business processes and integrate information systems. From\nlast-mile services to national-level reporting, it boosts efficiency &\neffectiveness while enabling secure, stable, scalable interoperability and data\nintegration at all levels.\n\n**Use it online at [app.openfn.org](https://app.openfn.org)**\n\n**Explore in a sandbox on [demo.openfn.org](#demo-sandbox)**\n\n**Or learn more at\n[docs.openfn.org](https://docs.openfn.org/documentation/about-lightning)**\n\n> OpenFn **Lightning** is:\n>\n> - the **latest version** of OpenFn: first launched in 2014, it's been tried\n> and tested by NGOs and governments in 40+ countries\n> - fully **open source**: there's no \"community edition\" and \"premium edition\",\n> you get the same product whether you are self-hosting or using the\n> OpenFn.org software-as-a-service\n> - the leading [DPGA](https://digitalpublicgoods.net/) certified **Digital\n> Public Good** for workflow automation\n> - a [Digital Square](https://digitalsquare.org/digital-health-global-goods)\n> certified **Global Good for Health**","ref":"readme.html"},{"type":"extras","title":"Contents - Lightning","doc":"- [Demo](#demo)\n- [Features](#features)\n - [Build](#build)\n - [Monitor](#monitor)\n - [Manage](#manage)\n - [Roles and permissions](#roles-and-permissions)\n - [Roadmap](#roadmap)\n- [Getting Started](#getting-started)\n - [**Run** via Docker](#run-via-docker)\n - [**Deploy** on external infrastructure](#deploy-on-external-infrastructure)\n - [**Dev** on Lightning locally](#dev-on-lightning-locally)\n- [Security and Standards](#security-and-standards)\n- [**Contribute** to this project](#contribute-to-this-project)\n - [Pick up an issue](#pick-up-an-issue)\n - [Open a pull request](#open-a-pull-request)\n - [Generate the docs pages](#generate-the-docs-pages)\n- [Server Specs for Self-Hosting](#server-specs-for-self-hosting)\n- [Benchmarking](#benchmarking)\n- [Troubleshooting](#troubleshooting)\n - [Problems with environment variables](#problems-with-environment-variables)\n - [Problems with Postgres](#problems-with-postgres)\n - [Problems with Debian](#problems-with-debian)\n - [Problems with Docker](#problems-with-docker)\n - [Problems with Rambo](#problems-with-rambo)\n- [Support](#support)","ref":"readme.html#contents"},{"type":"extras","title":"Demo - Lightning","doc":"Watch a short [demo video](https://www.youtube.com/watch?v=BNaxlHAWb5I) or\nexplore a **[public sandbox](https://demo.openfn.org/)** with the login details\nbelow, but please note that this deployment is reset every night at 12:00:00 UTC\nand is 100% publicly accessible. **_Don't build anything you want to keep, or\nkeep private!_**\n\n```\nusername: demo@openfn.org\npassword: welcome12345\n```","ref":"readme.html#demo"},{"type":"extras","title":"Features - Lightning","doc":"#","ref":"readme.html#features"},{"type":"extras","title":"Build - Lightning","doc":"Plan and build workflows using Lightning's visual interface to quickly define\nwhen, where and what you want your automation to do.\n\n \n \n \n\nUse our\n[CLI](https://github.com/OpenFn/kit/blob/main/packages/cli/README.md#openfncli)\nto quickly build, edit and deploy projects from the comfort of your own code\neditor.\n\n#","ref":"readme.html#build"},{"type":"extras","title":"Monitor - Lightning","doc":"Monitor all workflow activity in one place.\n\n \n \n \n\n- Filter and search runs to identify issues that need addressing and follow how\n a specific request has been processed\n- Configure alerts to be notified on run failures\n- Receive a project digest for a daily/weekly/monthly summary of your project\n activity\n\n#","ref":"readme.html#monitor"},{"type":"extras","title":"Manage - Lightning","doc":"Manage users and access by project.\n\n \n \n \n\n#","ref":"readme.html#manage"},{"type":"extras","title":"Roles and permissions - Lightning","doc":"Authorization is a central part of Lightning. As such, users are given different\nroles which determine what level of access they have for resources in the\napplication. For more details about roles and permissions in Lightning, please\nrefer to our\n[documentation](https://docs.openfn.org/documentation/about-lightning#roles-and-permissions).\n\n#","ref":"readme.html#roles-and-permissions"},{"type":"extras","title":"Roadmap - Lightning","doc":"View our\n[public GitHub project](https://github.com/orgs/OpenFn/projects/3/views/1) to\nsee what we're working on now and what's coming next.","ref":"readme.html#roadmap"},{"type":"extras","title":"Getting Started - Lightning","doc":"- If you only want to [_**RUN**_](#run-via-docker) Lightning on your own server,\n we recommend using Docker.\n- If you want to [_**DEPLOY**_](#deploy-on-external-infrastructure) Lightning,\n we recommend Docker builds and Kubernetes.\n- If you want to [_**CONTRIBUTE**_](#contribute-to-this-project) to the project,\n we recommend\n [running Lightning on your local machine](#run-lightning-locally).\n\n### **Run** via Docker\n\n1. Install the latest version of\n [Docker](https://docs.docker.com/engine/install/)\n2. Clone [this repo](https://github.com/OpenFn/Lightning) using git\n3. Setup PostgreSQL database with:\n `docker compose build && docker compose run --rm web mix ecto.migrate`\n4. Run Lightning and PostgresSQL with: `docker compose up`\n\nBy default the application will be running at\n[localhost:4000](http://localhost:4000/).\n\nSee [\"Problems with Docker\"](#problems-with-docker) for additional\ntroubleshooting help. Note that you can also create your own\n`docker-compose.yml` file, configuring a postgres database and using a\n[pre-built image](https://hub.docker.com/repository/docker/openfn/lightning)\nfrom Dockerhub.\n\n### **Deploy** on external infrastructure\n\nHead to the [Deploy](https://docs.openfn.org/documentation/deploy/options)\nsection of our docs site to get started.\n\nFor technical guidelines, see [deployment considerations](DEPLOYMENT.md) for\nmore detailed information.\n\n### **Dev** on Lightning locally\n\n##","ref":"readme.html#getting-started"},{"type":"extras","title":"Clone the repo and optionally set ENVs - Lightning","doc":"```sh\ngit clone git@github.com:OpenFn/Lightning.git # or from YOUR fork!\ncd Lightning\ncp .env.example .env # and adjust as necessary!\n```\n\nTake note of database names and ports in particular—they've got to match across\nyour Postgres setup and your ENVs. You can run lightning without any ENVs\nassuming a vanilla postgres setup (see below), but you may want to make\nadjustments.\n\n##","ref":"readme.html#clone-the-repo-and-optionally-set-envs"},{"type":"extras","title":"Database Setup - Lightning","doc":"If you're already using Postgres locally, create a new database called\n`lightning_dev`, for example.\n\nIf you'd rather use Docker to set up a Postgres DB, create a new volume and\nimage:\n\n```sh\ndocker volume create lightning-postgres-data\n\ndocker create \\\n --name lightning-postgres \\\n --mount source=lightning-postgres-data,target=/var/lib/postgresql/data \\\n --publish 5432:5432 \\\n -e POSTGRES_PASSWORD=postgres \\\n postgres:15.3-alpine\n\ndocker start lightning-postgres\n```\n\n##","ref":"readme.html#database-setup"},{"type":"extras","title":"Elixir & Ecto Setup - Lightning","doc":"We use [asdf](https://github.com/asdf-vm/asdf) to configure our local\nenvironments. Included in the repo is a `.tool-versions` file that is read by\nasdf in order to dynamically make the specified versions of Elixir and Erlang\navailable. You'll need asdf plugins for\n[Erlang](https://github.com/asdf-vm/asdf-erlang),\n[NodeJs](https://github.com/asdf-vm/asdf-nodejs)\n[Elixir](https://github.com/asdf-vm/asdf-elixir) and\n[k6](https://github.com/grimoh/asdf-k6).\n\nWe use [libsodium](https://doc.libsodium.org/) for encoding values as required\nby the\n[Github API](https://docs.github.com/en/rest/guides/encrypting-secrets-for-the-rest-api).\nYou'll need to install `libsodium` in order for the application to compile.\n\nFor Mac Users:\n\n```sh\nbrew install libsodium\n```\n\nFor Debian Users:\n\n```sh\nsudo apt-get install libsodium-dev\n```\n\nYou can find more on\n[how to install libsodium here](https://doc.libsodium.org/installation)\n\n```sh\nasdf install # Install language versions\nmix local.hex\nmix deps.get\nmix local.rebar --force\nmix ecto.create # Create a development database in Postgres\nmix ecto.migrate\n[[ $(uname -m) == 'arm64' ]] && CPATH=/opt/homebrew/include LIBRARY_PATH=/opt/homebrew/lib mix deps.compile enacl # Force compile enacl if on M1\n[[ $(uname -m) == 'arm64' ]] && mix compile.rambo # Force compile rambo if on M1\nmix lightning.install_runtime\nmix lightning.install_schemas\nmix lightning.install_adaptor_icons\nnpm install --prefix assets\n```\n\n##","ref":"readme.html#elixir-ecto-setup"},{"type":"extras","title":"Run the app - Lightning","doc":"Lightning is a web app. To run it in interactive Elixir mode, start the\ndevelopment server by running with your environment variables by running:\n\n```sh\niex -S mix phx.server\n```\n\nor if you have set up custom environment variables, run:\n\n```sh\nenv $(cat .env | grep -v \"#\" | xargs ) iex -S mix phx.server\n```\n\nOnce the server has started, head to [`localhost:4000`](http://localhost:4000)\nin your browser.\n\n##","ref":"readme.html#run-the-app"},{"type":"extras","title":"Run the tests - Lightning","doc":"Before the first time running the tests, you need a test database setup.\n\n```sh\nMIX_ENV=test mix ecto.create\n```\n\nAnd then after that run the tests using:\n\n```sh\nMIX_ENV=test mix test\n```\n\nWe also have `test.watch` installed which can be used to rerun the tests on file\nchanges.","ref":"readme.html#run-the-tests"},{"type":"extras","title":"Security and Standards - Lightning","doc":"We use a host of common Elixir static analysis tools to help us avoid common\npitfalls and make sure we keep everything clean and consistent.\n\nIn addition to our test suite, you can run the following commands:\n\n- `mix format --check-formatted` Code formatting checker, run again without the\n `--check-formatted` flag to have your code automatically changed.\n- `mix dialyzer` Static analysis for type mismatches and other common warnings.\n See [dialyxir](https://github.com/jeremyjh/dialyxir).\n- `mix credo --strict --all` Static analysis for consistency, and coding\n standards. See [Credo](https://github.com/rrrene/credo).\n- `mix sobelow` Check for commonly known security exploits. See\n [Sobelow](https://sobelow.io/).\n- `MIX_ENV=test mix coveralls` Test coverage reporter. This command also runs\n the test suite, and can be used in place of `mix test` when checking\n everything before pushing your code. See\n [excoveralls](https://github.com/parroty/excoveralls).\n\n> For convenience there is a `verify` mix task that runs all of the above and\n> defaults the `MIX_ENV` to `test`.\n\nFor more guidance on security best practices for workflow automation\nimplementations, check out OpenFn Docs:\n[docs.openfn.org/documentation/getting-started/security](https://docs.openfn.org/documentation/getting-started/security)\n\n## **Contribute** to this project\n\nFirst, thanks for being here! You're contributing to a digital public good that\nwill always be free and open source and aimed at serving innovative NGOs,\ngovernments, and social impact organizations the world over! You rock. ❤️\n\nFYI, Lightning is built in [Elixir](https://elixir-lang.org/), harnessing the\n[Phoenix Framework](https://www.phoenixframework.org/). Currently, the only\nunbundled dependency is a [PostgreSQL](https://www.postgresql.org/) database.\n\nIf you'd like to contribute to this projects, follow the steps below:\n\n#","ref":"readme.html#security-and-standards"},{"type":"extras","title":"Pick up an issue - Lightning","doc":"Read through the existing [issues](https://github.com/OpenFn/Lightning/issues),\nassign yourself to the issue you have chosen. Leave a comment on the issue to\nlet us know you'll be working on it, and if you have any questions of\nclarifications that would help you get started ask them there - we will get back\nto you as soon as possible.\n\nIf there isn't already an issue for the feature you would like to contribute,\nplease start a discussion in our\n[community forum](https://community.openfn.org/c/feature-requests/12).\n\n#","ref":"readme.html#pick-up-an-issue"},{"type":"extras","title":"Open a pull request - Lightning","doc":"1. Clone the Lightning repository, then\n [fork it](https://docs.github.com/en/get-started/quickstart/fork-a-repo).\n\n2. Run through [setting up your environment](#set-up-your-environment) and make\n your changes.\n\n3. Make sure you have written your tests and updated /CHANGELOG.md (in the\n 'Unreleased' section, add a short description of the changes you are making,\n along with a link to your issue).\n\n4. Open a draft pull request by clicking \"Contribute > Open Pull Request\" from\n your forked repository. Fill out the pull request template (this will **be**\n added automatically for you), then make sure to self-review your code and go\n through the 'Review checklist'. Don't worry about the QA checkbox, our\n product manager Amber will tick that once she has reviewed your PR. You can\n leave any notes for the reviewer in a comment.\n\n5. Once you're ready to submit a pull request, you can mark your draft PR as\n 'Ready for review' and assign @stuartc or @taylordowns2000.\n\n#","ref":"readme.html#open-a-pull-request"},{"type":"extras","title":"Generate the docs pages - Lightning","doc":"You can generate the HTML and EPUB documentation locally using:\n\n`mix docs` and opening `doc/index.html` in your browser.","ref":"readme.html#generate-the-docs-pages"},{"type":"extras","title":"Server Specs for Self-Hosting - Lightning","doc":"For recommend server specifications for self-hosting of Lightning, head to the\n[deployment planning](https://docs.openfn.org/documentation/deploy/options)\nsection of the documentation or check out this\n[self-hosting thread](https://community.openfn.org/t/specs-for-self-hosting-lightning/292)\non our community forum.","ref":"readme.html#server-specs-for-self-hosting"},{"type":"extras","title":"Benchmarking - Lightning","doc":"We are using [k6](https://k6.io/) to benchmark Lightning. Under `benchmarking`\nfolder you can find a script for benchmarking Webhook Workflows.\n\nSee [Benchmarking](benchmarking/README.md) for more detailed information.","ref":"readme.html#benchmarking"},{"type":"extras","title":"Troubleshooting - Lightning","doc":"#","ref":"readme.html#troubleshooting"},{"type":"extras","title":"Problems with environment variables - Lightning","doc":"For troubleshooting custom environment variable configuration it's important to\nknow how an Elixir app loads and modifies configuration. The order is as\nfollows:\n\n1. Stuff in `config.exs` is loaded.\n2. _That_ is then modified (think: _overwritten_) by stuff your ENV-specific\n config: `dev.exs`, `prod.exs` or `test.exs`.\n3. _That_ is then modified by `runtime.exs` which is where you are allowed to\n use `System.env()`\n4. _Finally_ `init/2` (if present in a child application) gets called (which\n takes the config which has been set in steps 1-3) when that child application\n is started during the parent app startup defined in `application.ex`.\n\n#","ref":"readme.html#problems-with-environment-variables"},{"type":"extras","title":"Problems with Postgres - Lightning","doc":"If you're having connecting issues with Postgres, check the database section of\nyour `.env` to ensure the DB url is correctly set for your environment — note\nthat composing a DB url out of other, earlier declared variables, does not work\nwhile using `xargs`.\n\n#","ref":"readme.html#problems-with-postgres"},{"type":"extras","title":"Problems with Debian - Lightning","doc":"If you're getting this error on debian\n\n```\n==> earmark_parser\nCompiling 1 file (.yrl)\n/usr/lib/erlang/lib/parsetools-2.3.1/include/yeccpre.hrl: no such file or directory\ncould not compile dependency :earmark_parser, \"mix compile\" failed. You can recompile this dependency with \"mix deps.compile earmark_parser\", update it with \"mix deps.update earmark_parser\" or clean it with \"mix deps.clean earmark_parser\"\n```\n\nYou need to install erlang development environment `sudo apt install erlang-dev`\n[refer to this issue](https://github.com/elixir-lang/ex_doc/issues/1441)\n\n#","ref":"readme.html#problems-with-debian"},{"type":"extras","title":"Problems with Docker - Lightning","doc":"##","ref":"readme.html#problems-with-docker"},{"type":"extras","title":"Versions - Lightning","doc":"The build may not work on old versions of Docker and Docker compose. It has been\ntested against:\n\n```\nDocker version 20.10.17, build 100c701\nDocker Compose version v2.6.0\n```\n\n##","ref":"readme.html#versions"},{"type":"extras","title":"Starting from scratch - Lightning","doc":"If you're actively working with docker, you start experiencing issues, and you\nwould like to start from scratch you can clean up everything and start over like\nthis:\n\n```sh\n# To remove any ignored files and reset your .env to it's example\ngit clean -fdx && cp .env.example .env\n# You can skip the line below if you want to keep your database\ndocker compose down --rmi all --volumes\n\ndocker compose build --no-cache web && \\\n docker compose create --force-recreate\n\ndocker compose run --rm web mix ecto.migrate\ndocker compose up\n```\n\n##","ref":"readme.html#starting-from-scratch"},{"type":"extras","title":"Apple Silicon - Lightning","doc":"When running `docker compose up` on Apple Silicon (M1, M2, M3), you might encounter the following error:\n\n```\n> [web 20/20] RUN npm install --prefix assets:\n0.091 rosetta error: failed to open elf at /lib64/ld-linux-x86-64.so.2\n0.091 Trace/breakpoint trap\n------\nfailed to solve: process \"/bin/sh -c npm install --prefix assets\" did not complete successfully: exit code: 133\n```\n\nYou can solve this by setting the default docker platform to `linux/amd64`, i.e. `DOCKER_DEFAULT_PLATFORM=linux/amd64`.\nYou can read more on this here: https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direc\n\nYou might also run into:\n\n```\n[notice] Application ssl exited: exited in: :ssl_app.start(:normal, [])\n ** (EXIT) an exception was raised:\n ** (ArgumentError) could not call Module.put_attribute/3 because the module Lightning.MixProject is already compiled\n (elixir 1.16.2) lib/module.ex:2360: Module.assert_not_readonly!/2\n (elixir 1.16.2) lib/module.ex:2041: Module.__put_attribute__/5\n (ssl 11.1.4) ssl_app.erl:35: :ssl_app.stop/1\n (kernel 9.2.4) application_master.erl:293: :application_master.start_it_old/4\n\n** (MatchError) no match of right hand side value: {:error, {:ssl, {:bad_return, {{:ssl_app, :start, [:normal, []]}, {:EXIT, {%ArgumentError{message: \"could not call Module.put_attribute/3 because the module Lightning.MixProject is already compiled\"}, [{Module, :assert_not_readonly!, 2, [file: ~c\"lib/module.ex\", line: 2360]}, {Module, :__put_attribute__, 5, [file: ~c\"lib/module.ex\", line: 2041]}, {:ssl_app, :stop, 1, [file: ~c\"ssl_app.erl\", line: 35]}, {:application_master, :start_it_old, 4, [file: ~c\"application_master.erl\", line: 293]}]}}}}}}\n```\n\nYou can resolve this by setting `ERL_FLAGS=\"+JPperf true\"` env to the failing stage.\nYou can follow this thread on our community forum for more info: https://community.openfn.org/t/lightning-prebuilt-images-throw-no-matching-manifest-for-linux-arm64-v8-in-the-manifest-list-entries/465/15\n\n#","ref":"readme.html#apple-silicon"},{"type":"extras","title":"Problems with Rambo - Lightning","doc":"When running `mix compile.rambo` on Apple Silicon (an Apple M1/M2, `macarm`,\n`aarch64-apple-darwin`) and encountering the following error:\n\n```\n** (RuntimeError) Rambo does not ship with binaries for your environment.\n\n aarch64-apple-darwin22.3.0 detected\n\nInstall the Rust compiler so a binary can be prepared for you.\n\n lib/mix/tasks/compile.rambo.ex:89: Mix.Tasks.Compile.Rambo.compile!/0\n lib/mix/tasks/compile.rambo.ex:51: Mix.Tasks.Compile.Rambo.run/1\n (mix 1.14.2) lib/mix/task.ex:421: anonymous fn/3 in Mix.Task.run_task/4\n (mix 1.14.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2\n```\n\nYou can resolve this error by installing the Rust compiler using Homebrew. Run\nthe following command in your terminal: `brew install rust`\n\nIf you have already compiled Rambo explicitly via `mix compile.rambo`, and you\nare still seeing the following error:\n\n```\nsh: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: No such file or directory\nsh: line 0: exec: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: cannot execute: No such file or directory\n```\n\nYou can try renaming `deps/rambo/priv/rambo-mac` to `deps/rambo/priv/rambo`.\n\nIf neither of the approaches above work, please raise an issue.","ref":"readme.html#problems-with-rambo"},{"type":"extras","title":"Support - Lightning","doc":"If you have any questions, feedback, or issues, please:\n\n- Post on the OpenFn Community at\n [community.openfn.org](https://community.openfn.org)\n- Open an issue directly on this GitHub Repo:\n [github.com/OpenFn/Lightning/issues](https://github.com/OpenFn/Lightning/issues)","ref":"readme.html#support"},{"type":"extras","title":"Running Locally","doc":"# Running Lightning Locally\n\nThis guide provides instructions for running Lightning locally, either by\ninstalling dependencies on your machine or using Docker.","ref":"runninglocal.html"},{"type":"extras","title":"By Installing Dependencies - Running Locally","doc":"#","ref":"runninglocal.html#by-installing-dependencies"},{"type":"extras","title":"Setup - Running Locally","doc":"##","ref":"runninglocal.html#setup"},{"type":"extras","title":"Postgres - Running Locally","doc":"Requires `postgres 15`.\nWhen running in `dev` mode, the app will use the following credentials to authenticate:\n- `PORT`: `5432`\n- `USER`: `postgres`\n- `PASSWORD`: `postgres`\n- `DATABASE`: `lightning_dev`\n\nThis can however be overriden by specifying a `DATABASE_URL` env var.\ne.g. `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/lightning_dev`\n\nWe recommend that you use docker for running postgres as you'll get an exact version that we use:\n\n```sh\ndocker volume create lightning-postgres-data\n\ndocker create \\\n --name lightning-postgres \\\n --mount source=lightning-postgres-data,target=/var/lib/postgresql/data \\\n --publish 5432:5432 \\\n -e POSTGRES_PASSWORD=postgres \\\n postgres:15.3-alpine\n\ndocker start lightning-postgres\n```\n\n##","ref":"runninglocal.html#postgres"},{"type":"extras","title":"Elixir, NodeJS - Running Locally","doc":"We use [asdf](https://github.com/asdf-vm/asdf) to configure our local\nenvironments. Included in the repo is a `.tool-versions` file that is read by\nasdf in order to dynamically make the specified versions of Elixir, Erlang and NodeJs\navailable. You'll need asdf plugins for\n[Erlang](https://github.com/asdf-vm/asdf-erlang),\n[NodeJs](https://github.com/asdf-vm/asdf-nodejs)\n[Elixir](https://github.com/asdf-vm/asdf-elixir) and\n[k6](https://github.com/grimoh/asdf-k6).\n\n##","ref":"runninglocal.html#elixir-nodejs"},{"type":"extras","title":"Libsodium - Running Locally","doc":"We use [libsodium](https://doc.libsodium.org/) for encoding values as required\nby the\n[Github API](https://docs.github.com/en/rest/guides/encrypting-secrets-for-the-rest-api).\nYou'll need to install `libsodium` in order for the application to compile.\n\nFor Mac Users:\n\n```sh\nbrew install libsodium\n```\n\nFor Debian Users:\n\n```sh\nsudo apt-get install libsodium-dev\n```\n\nYou can find more on\n[how to install libsodium here](https://doc.libsodium.org/installation)\n\n##","ref":"runninglocal.html#libsodium"},{"type":"extras","title":"Compilation and Assets - Running Locally","doc":"```sh\nasdf install # Install language versions\nmix local.hex\nmix deps.get\nmix local.rebar --force\n[[ $(uname -m) == 'arm64' ]] && CPATH=/opt/homebrew/include LIBRARY_PATH=/opt/homebrew/lib mix deps.compile enacl # Force compile enacl if on M1\n[[ $(uname -m) == 'arm64' ]] && mix compile.rambo # Force compile rambo if on M1\nmix lightning.install_runtime\nmix lightning.install_schemas\nmix lightning.install_adaptor_icons\nmix ecto.create\nmix ecto.migrate\nnpm install --prefix assets\n```\n\nIn case you encounter errors running any of these commands, see the [troubleshooting guide](README.md#troubleshooting) for\nknown errors.\n\n#","ref":"runninglocal.html#compilation-and-assets"},{"type":"extras","title":"Running the App - Running Locally","doc":"To start the lightning server:\n\n```sh\nmix phx.server\n```\n\nOnce the server has started, head to [`localhost:4000`](http://localhost:4000)\nin your browser.\n\nBy default, the `worker` is started when run `mix phx.server` in `dev` mode. In case you\ndon't want to have your worker started in `dev`, set `RTM=false`:\n\n```sh\nRTM=false mix phx.server\n```","ref":"runninglocal.html#running-the-app"},{"type":"extras","title":"Using Docker - Running Locally","doc":"There is an existing `docker-compose.yaml` file in the project's root which has all the\nservices required. To start your services:\n\n```sh\ndocker compose up\n```\n\nThere 2 docker files in the root, `Dockerfile` builds the app in `prod` mode while `Dockerfile-dev`\nruns it in `dev` mode. It is important to note that `mix commands` do not work in the `prod` images.\n\nFor exmaple, to run migrations in `dev` mode you run:\n\n```sh\ndocker compose run --rm web mix ecto.migrate\n```\n\nWhile in `prod` mode:\n\n```sh\ndocker compose run --rm web /app/bin/lightning eval \"Lightning.Release.migrate()\"\n```\n\n#","ref":"runninglocal.html#using-docker"},{"type":"extras","title":"Configuring the Worker - Running Locally","doc":"By default, lightning starts the `worker` when running in `dev`. This can also be configured using\n`RTM` env var. In case you don't want the hassle of configuring the worker in `dev`, you can just\nremove/comment out the `worker` service from the `docker-compose.yaml` file because lightning will\nstart it for you.\n\n[Learn more about configuring workers](WORKERS.md)\n\n#","ref":"runninglocal.html#configuring-the-worker"},{"type":"extras","title":"Problems with Apple Silicon - Running Locally","doc":"You might run into some errors when running the docker containers on Apple Silicon.\n[We have documented the known ones here](README.md#problems-with-docker)","ref":"runninglocal.html#problems-with-apple-silicon"},{"type":"extras","title":"Deployment","doc":"# Deployment\n\nHead to the [Deploy](https://docs.openfn.org/documentation/deploy/options)\nsection of our docs site to get started.\n\nSee below for technical considerations and instructions.","ref":"deployment.html"},{"type":"extras","title":"Encryption - Deployment","doc":"Lightning enforces encryption at rest for credentials, TOTP backup codes, and\nwebhook trigger authentication methods, for which an encryption key must be\nprovided when running in production.\n\nThe key is expected to be a randomized set of bytes, 32 long; and Base64 encoded\nwhen setting the environment variable.\n\nThere is a mix task that can generate keys in the correct shape for use as an\nenvironment variable:\n\n```sh\nmix lightning.gen_encryption_key\n0bJ9w+hn4ebQrsCaWXuA9JY49fP9kbHmywGd5K7k+/s=\n```\n\nCopy your key _(NOT THIS ONE)_ and set it as `PRIMARY_ENCRYPTION_KEY` in your\nenvironment.","ref":"deployment.html#encryption"},{"type":"extras","title":"Workers - Deployment","doc":"Lightning uses external worker processes for executing Runs. There are three\nsettings required to configure worker authentication.\n\n- `WORKER_RUNS_PRIVATE_KEY`\n- `WORKER_LIGHTNING_PUBLIC_KEY`\n- `WORKER_SECRET`\n\nYou can use the `mix lightning.gen_worker_keys` task to generate these for\nconvenience.\n\nFor more information see the [Workers](WORKERS.md) documentation.","ref":"deployment.html#workers"},{"type":"extras","title":"Environment Variables - Deployment","doc":"Note that for secure deployments, it's recommended to use a combination of\n`secrets` and `configMaps` to generate secure environment variables.\n\n#","ref":"deployment.html#environment-variables"},{"type":"extras","title":"Limits - Deployment","doc":"- `WORKER_MAX_RUN_MEMORY_MB` - how much memory (in MB) can a single run use?\n- `RUN_GRACE_PERIOD_SECONDS` - how long _after_ the `MAX_RUN_DURATION_SECONDS`\n should the server wait for the worker to send back data on a run.\n- `WORKER_MAX_RUN_DURATION_SECONDS` - the maximum duration (in seconds) that\n workflows are allowed to run (keep this plus `RUN_GRACE_PERIOD_SECONDS` below\n your termination_grace_period if using kubernetes)\n- `WORKER_CAPACITY` - the number of runs a ws-worker instance will take on\n concurrently.\n- `MAX_DATACLIP_SIZE_MB` - the maximum size (in MB) of a dataclip created via\n the webhook trigger URL for a job. This limits the max request size via the\n JSON plug and may (in future) limit the size of dataclips that can be stored\n as run_results via the websocket connection from a worker.\n\n#","ref":"deployment.html#limits"},{"type":"extras","title":"Github - Deployment","doc":"Lightning enables connection to github via Github Apps. The following github\npermissions are needed for the github app:\n\n| **Resource** | **Access** |\n| ------------ | -------------- |\n| Actions | Read and Write |\n| Contents | Read and Write |\n| Metadata | Read only |\n| Secrets | Read and Write |\n| Workflows | Read and Write |\n\nEnsure you set the following URLs:\n* **Homepage URL:** ` `\n* **Callback URL for authorizing users:** ` /oauth/github/callback` (Do NOT check the two checkboxes in this section requesting Device Flow and OAuth.)\n* **Setup URL for Post installation:** ` /setup_vcs` (Check the box for **Redirect on update**)\n\nThese envrionment variables will need to be set in order to configure the github\napp:\n\n| **Variable** | **Description** |\n| -------------------------- | ---------------------------- |\n| `GITHUB_APP_ID` | the github app ID. |\n| `GITHUB_APP_NAME` | the github app name |\n| `GITHUB_APP_CLIENT_ID` | the github app Client ID |\n| `GITHUB_APP_CLIENT_SECRET` | the github app Client Secret |\n| `GITHUB_CERT` | the github app private key |\n\nYou can access these from your github app settings menu. Also needed for the\nconfigurtaion is:\n\n- `REPO_CONNECTION_SIGNING_SECRET` - secret used to sign access tokens. This\n access token is used to authenticate requests made from the github actions.\n You can generate this using `mix lightning.gen_encryption_key`\n\n#","ref":"deployment.html#github"},{"type":"extras","title":"Storage - Deployment","doc":"Lightning can use a storage backend to store exports.\n\n| **Variable** | Description |\n| ----------------- | ------------------------------------------------ |\n| `STORAGE_BACKEND` | the storage backend to use. (default is `local`) |\n| `STORAGE_PATH` | the path to store files in. (default is `.`) |\n\n##","ref":"deployment.html#storage"},{"type":"extras","title":"Supported backends: - Deployment","doc":"- `local` - local file storage\n- `gcs` - Google Cloud Storage\n\n##","ref":"deployment.html#supported-backends"},{"type":"extras","title":"Google Cloud Storage - Deployment","doc":"For Google Cloud Storage, the following environment variables are required:\n\n| **Variable** | Description |\n| ------------------------------------- | -------------------------------------------------------------------------------- |\n| `GCS_BUCKET` | the name of the bucket to store files in |\n| `GOOGLE_APPLICATION_CREDENTIALS_JSON` | A base64 encoded JSON keyfile for the service account with access to the bucket. |\n\n> ℹ️ Note: The `GOOGLE_APPLICATION_CREDENTIALS_JSON` should be base64 encoded,\n> currently Workload Identity is not supported.\n\n#","ref":"deployment.html#google-cloud-storage"},{"type":"extras","title":"Other config - Deployment","doc":"| **Variable** | Description |\n| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `ADAPTORS_PATH` | Where you store your locally installed adaptors |\n| `ALLOW_SIGNUP` | Set to `true` to enable user access to the registration page. Set to `false` to disable new user registrations and block access to the registration page. Default is `true`. |\n| `CORS_ORIGIN` | A list of acceptable hosts for browser/cors requests (',' separated) |\n| `DISABLE_DB_SSL` | In production, the use of an SSL connection to Postgres is required by default. Setting this to `\"true\"` allows unencrypted connections to the database. This is strongly discouraged in a real production environment. |\n| `EMAIL_ADMIN` | This is used as the sender email address for system emails. It is also displayed in the menu as the support email. |\n| `EMAIL_SENDER_NAME` | This is displayed in the email client as the sender name for emails sent by the application. |\n| `IDLE_TIMEOUT` | The number of seconds that must pass without data being received before the Lightning web server kills the connection. |\n| `IS_RESETTABLE_DEMO` | If set to `yes`, it allows this instance to be reset to the initial \"Lightning Demo\" state. Note that this will destroy _most_ of what you have in your database! |\n| `K8S_HEADLESS_SERVICE` | This environment variable is automatically set if you're running on GKE and it is used to establish an Erlang node cluster. Note that if you're _not_ using Kubernetes, the \"gossip\" strategy is used to establish clusters. |\n| `LISTEN_ADDRESS` | The address the web server should bind to. Defaults to `127.0.0.1` to block access from other machines. |\n| `LOG_LEVEL` | How noisy you want the logs to be (e.g., `debug`, `info`) |\n| `MIX_ENV` | Your mix env, likely `prod` for deployment |\n| `NODE_ENV` | Node env, likely `production` for deployment |\n| `ORIGINS` | The allowed origins for web traffic to the backend |\n| `PORT` | The port your Phoenix app runs on |\n| `PRIMARY_ENCRYPTION_KEY` | A base64 encoded 32 character long string. See [Encryption](#encryption). |\n| `QUEUE_RESULT_RETENTION_PERIOD_SECONDS` | The number of seconds to keep completed (successful) `ObanJobs` in the queue (not to be confused with runs and/or history) |\n| `SCHEMAS_PATH` | Path to the credential schemas that provide forms for different adaptors |\n| `SECRET_KEY_BASE` | A secret key used as a base to generate secrets for encrypting and signing data. |\n| `SENTRY_DSN` | If using Sentry for error monitoring, your DSN |\n| `URL_HOST` | The host used for writing URLs (e.g., `demo.openfn.org`) |\n| `URL_PORT` | The port, usually `443` for production |\n| `URL_SCHEME` | The scheme for writing URLs (e.g., `https`) |\n| `USAGE_TRACKER_HOST` | The host that receives usage tracking submissions (defaults to https://impact.openfn.org) |\n| `USAGE_TRACKING_DAILY_BATCH_SIZE` | The number of days that will be reported on with each run of `UsageTracking.DayWorker`. This will only have a noticeable effect in cases where there is a backlog or where reports are being generated retroactively (defaults to 10). |\n| `USAGE_TRACKING_ENABLED` | Enables the submission of anonymized usage data to OpenFn (defaults to `true`) |\n| `USAGE_TRACKING_RESUBMISSION_BATCH_SIZE` | The number of failed reports that will be submitted on each resubmission run (defaults to 10) |\n| `USAGE_TRACKING_UUIDS` | Indicates whether submissions should include cleartext UUIDs or not. Options are `cleartext` or `hashed_only`, with the default being `hashed_only`. |\n\n#","ref":"deployment.html#other-config"},{"type":"extras","title":"AI Chat - Deployment","doc":"🧪 **Experimental**\n\nLightning can be configured to use an AI chatbot for user interactions.\n\nSee [openfn/apollo](https://github.com/OpenFn/apollo) for more information on\nthe Apollo AI service.\n\nThe following environment variables are required:\n\n- `OPENAI_API_KEY` - your OpenAI API key.\n- `APOLLO_ENDPOINT` - the endpoint for the OpenFn Apollo AI service.\n\n#","ref":"deployment.html#ai-chat"},{"type":"extras","title":"Kafka Triggers - Deployment","doc":"🧪 **Experimental**\n\nLightning workflows can be configured with a trigger that will consume messages\nfrom a Kafka Cluster. By default this is disabled and you will not see the\noption to create a Kafka trigger in the UI, nor will the Kafka consumer groups\nbe running.\n\nTo enable this feature set the `KAFKA_TRIGGERS_ENABLED` environment variable to\n`yes` and restart Lightning. Please note that, if you enable this feature and\nthen create some Kafka triggers and then disable the feature, you will not be\nable to edit any triggers created before the feature was disabled.\n\n##","ref":"deployment.html#kafka-triggers"},{"type":"extras","title":"Performance Tuning - Deployment","doc":"The number of Kafka consumers in the consumer group can be modified by setting\nthe `KAFKA_NUMBER_OF_CONSUMERS` environment variable. The default value is\ncurrently 1. The optimal setting is one consumer per topic partition. NOTE: This\nsetting will move to KafkaConfiguration as it will be trigger-specific.\n\nThe number of messages that the Kafka consumer will forward is rate-limited by\nthe `KAFKA_NUMBER_OF_MESSAGES_PER_SECOND` environment variable. This can be set\nto a value of less than 1 (minimum 0.1) and will converted (and rounded-down) to\nan integer value of messages over a 10-second interval (e.g. 0.15 becomes 1\nmessage every 10 seconds). The default value is 1.\n\nProcessing concurrency within the Kafka Broadway pipeline is controlled by the\n`KAFKA_NUMBER_OF_PROCESSORS` environment variable. Modifying this, modifies the\nnumber of processors that are downstream of the Kafka consumer, so an increase\nin this value should increase throughput (when factoring in the rate limit set\nby `KAFKA_NUMBER_OF_MESSAGES_PER_SECOND`). The default value is 1.\n\n##","ref":"deployment.html#performance-tuning"},{"type":"extras","title":"Deduplication - Deployment","doc":"Each Kafka trigger maintains record of the topic, parition and offset for each\nmessage received. This to protect against the ingestion of duplicate messages\nfrom the cluster. These records are periodically cleaned out. The duration for\nwhich they are retained is controlled by\n`KAFKA_DUPLICATE_TRACKING_RETENTION_SECONDS`. The default value is 3600.\n\n##","ref":"deployment.html#deduplication"},{"type":"extras","title":"Disabling Kafka Triggers - Deployment","doc":"After a Kafka consumer group connects to a Kafka cluster, the cluster will track\nthe last committed offset for a given consumer group ,to ensure that the consumer\ngroup receives the correct messages.\n\nThis data is retained for a finite period. If an enabled Kafka trigger is \ndisabled for longer than the offset retention period the consumer group offset\ndata will be cleared.\n\nIf the Kafka trigger is re-enabled after the offset data has been cleared, this\nwill result in the consumer group reverting to what has been configured as the\n'Initial offset reset policy' for the trigger. This may result in the\nduplication of messages or even data loss.\n\nIt is recommended that you check the value of the `offsets.retention.minutes` for\nthe Kafka cluster to determine what the cluster's retention period is, and\nconsider this when disabling a Kafka trigger for an extended period.\n\n#","ref":"deployment.html#disabling-kafka-triggers"},{"type":"extras","title":"Google Oauth2 - Deployment","doc":"Using your Google Cloud account, provision a new OAuth 2.0 Client with the 'Web\napplication' type.\n\nSet the callback url to: `https:// /authenticate/callback`.\nReplacing `ENDPOINT DOMAIN` with the host name of your instance.\n\nOnce the client has been created, get/download the OAuth client JSON and set the\nfollowing environment variables:\n\n| **Variable** | Description |\n| ---------------------- | --------------------------------------------- |\n| `GOOGLE_CLIENT_ID` | Which is `client_id` from the client details. |\n| `GOOGLE_CLIENT_SECRET` | `client_secret` from the client details. |\n\n#","ref":"deployment.html#google-oauth2"},{"type":"extras","title":"Salesforce Oauth2 - Deployment","doc":"Using your Salesforce developer account, create a new Oauth 2.0 connected\napplication.\n\nSet the callback url to: `https:// /authenticate/callback`.\nReplacing `ENDPOINT DOMAIN` with the host name of your instance.\n\nGrant permissions as desired.\n\nOnce the client has been created set the following environment variables:\n\n| **Variable** | Description |\n| -------------------------- | --------------------------------------------------------------------- |\n| `SALESFORCE_CLIENT_ID` | Which is `Consumer Key` from the \"Manage Consumer Details\" screen. |\n| `SALESFORCE_CLIENT_SECRET` | Which is `Consumer Secret` from the \"Manage Consumer Details\" screen. |","ref":"deployment.html#salesforce-oauth2"},{"type":"extras","title":"Benchmarking","doc":"# Benchmarking","ref":"benchmarking.md.html"},{"type":"extras","title":"Run benchmarking tests against the demo webhook - Benchmarking","doc":"Execute the following steps to run a benchmark on Lightning:\n\n1. Make sure you have [k6](https://k6.io/docs/get-started/installation/)\n installed locally. If you're using `asdf` you can run `asdf install` in the\n project root.\n\n2. Start up a local Lightning instance with an attached iex session. Note that\n to simulate a production environment, set `RTM=false`. In prod, you'll have\n your `ws-worker` running on a separate machine:\n\n `RMT=false iex -S mix phx.server`\n\n3. In the attached iex session, run the following, to have Lightning log\n internal telemetry data:\n\n ```elixir\n filepath = Path.join(\"benchmarking\", \"load_test_data.csv\")\n output_file = File.open!(filepath, [:append])\n\n c \"benchmarking/load_test_production_spans.exs\"\n\n LoadTestingPrep.init(output_file)\n ```\n\n4. Run the demo setup script: `mix run --no-start priv/repo/demo.exs` The\n `webhookURL` is already set to default to the webhook created in the demo\n data\n\n If you would like to point at a different instance or webhook url you\n can provide it via `WEBHOOK_URL`.\n\n5. In another terminal (do not stop the Lightning server) run the\n `benchmarking/script.js` file using the following command\n\n ```bash\n k6 run benchmarking/script.js\n ```\n\n If the script exits successfully, this means the app met the defined\n performance thresholds.\n\n By default, the test payload is just 2 kb. Should you wish to test it with\n larger payloads, you can pass in the `PAYLOAD_SIZE_KB` ENV variable. This\n variable allows you to specify the payload size in KB (for now, integer\n values only), (e.g. 2 KB):\n\n ```bash\n k6 run -e PAYLOAD_SIZE_KB=2 benchmarking/script.js\n ```\n\n To collect the benchmarking data in a CSV file, run the previous command with\n the `--out filename` option.\n\n ```bash\n k6 run --out csv=test_results.csv benchmarking/script.js\n ```\n\n6. In the iex session, close the output file:\n\n ```elixir\n LoadTestingPrep.fin(output_file)\n ```\n\nSee [results output](https://k6.io/docs/get-started/results-output/) for other\navailable output formats.\n\n#","ref":"benchmarking.md.html#run-benchmarking-tests-against-the-demo-webhook"},{"type":"extras","title":"Sample benchmarks - Benchmarking","doc":"##","ref":"benchmarking.md.html#sample-benchmarks"},{"type":"extras","title":"System specs on a 2020 MacBook Pro - Benchmarking","doc":"```\nModel Name: MacBook Pro\nModel Identifier: MacBookPro17,1\nModel Number: Z11B000E3LL/A\nChip: Apple M1\nTotal Number of Cores: 8 (4 performance and 4 efficiency)\nMemory: 16 GB\n```\n\n##","ref":"benchmarking.md.html#system-specs-on-a-2020-macbook-pro"},{"type":"extras","title":"Results with 50kb payloads - Benchmarking","doc":"```\nk6 run -e PAYLOAD_SIZE=10 benchmarking/script.js Node 18.17.1 k6 0.43.1 07:40:29\n\n /\\ |‾‾| /‾‾/ /‾‾/\n /\\ / \\ | |/ / / /\n / \\/ \\ | ( / ‾‾\\\n / \\ | |\\ \\ | (‾) |\n / __________ \\ |__| \\__\\ \\_____/ .io\n\n execution: local\n script: benchmarking/script.js\n output: -\n\n scenarios: (100.00%) 1 scenario, 50 max VUs, 2m50s max duration (incl. graceful stop):\n * webhookRequests: Up to 50.00 iterations/s for 2m20s over 3 stages (maxVUs: 50, gracefulStop: 30s)\n\n\n ✓ status was 200\n\n █ setup\n\n checks.........................: 100.00% ✓ 5765 ✗ 0\n data_received..................: 1.6 MB 12 kB/s\n data_sent......................: 59 MB 421 kB/s\n http_req_blocked...............: avg=16.01µs min=2µs med=9µs max=6.84ms p(90)=12µs p(95)=13µs\n http_req_connecting............: avg=4.35µs min=0s med=0s max=2.22ms p(90)=0s p(95)=0s\n ✓ http_req_duration..............: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms\n { expected_response:true }...: avg=53.62ms min=26.86ms med=49.03ms max=501.62ms p(90)=66.62ms p(95)=84.33ms\n ✓ http_req_failed................: 0.00% ✓ 0 ✗ 5765\n http_req_receiving.............: avg=88.57µs min=13µs med=90µs max=2.99ms p(90)=108µs p(95)=124.8µs\n http_req_sending...............: avg=97.47µs min=29µs med=83µs max=6.86ms p(90)=139µs p(95)=162µs\n http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s\n http_req_waiting...............: avg=53.44ms min=26.68ms med=48.84ms max=501.43ms p(90)=66.43ms p(95)=84.05ms\n http_reqs......................: 5765 41.15402/s\n iteration_duration.............: avg=54.34ms min=20.75µs med=49.75ms max=502.26ms p(90)=67.39ms p(95)=84.91ms\n iterations.....................: 5765 41.15402/s\n vus............................: 50 min=50 max=50\n vus_max........................: 50 min=50 max=50\n\n\nrunning (2m20.1s), 00/50 VUs, 5765 complete and 0 interrupted iterations\nwebhookRequests ✓ [======================================] 00/50 VUs 2m20s 01.12 iters/s\n```","ref":"benchmarking.md.html#results-with-50kb-payloads"},{"type":"extras","title":"Run load tests for a hypothetical cold chain system - Benchmarking","doc":"`benchmarking/sample_cold_chain_monitoring_script.js` contains a k6 script that\ncan be used to simulate data from a hypothetical cold chain system. It requires a\ncustom job to be created (an example of which can be found at the top of the\nscript file).\n\nThe test can be excuted as follows (`WEBHOOK_URL` is not optional):\n\n```bash\n WEBHOOK_URL=... k6 run benchmarking/sample_cold_chain_monitoring_script.js\n```","ref":"benchmarking.md.html#run-load-tests-for-a-hypothetical-cold-chain-system"},{"type":"extras","title":"Workers","doc":"# Workers\n\nThe OpenFn Runtime used by Lightning is a [Node.js](https://nodejs.org/en/)\napplication that runs on a server. It is responsible for executing the code that\nyou write in your OpenFn jobs.\n\nA Runtime Manager is a module or application that processes Runs, which\ncontains reference to the Workflow, the starting point and the initial data.\n\nRuns are enqueued, and Runtime Managers request work to be performed when\nthey are ready.","ref":"workers.html"},{"type":"extras","title":"History - Workers","doc":"In previous versions of OpenFn products, the server would invoke a NodeJS child\nprocess for each Run that needs to be executed. Deciding which Job to run in a\nworkflow is decided after each run is completed.\n\nThe current approach to executing Runs, is that a worker checks out the\nentire run and executes it and all the jobs required.\n\nThe advantage of this approach is a significant reduction in latency of\nlaunching new workers for every Run to be processed.","ref":"workers.html#history"},{"type":"extras","title":"Connecting Workers to Lightning - Workers","doc":"Our standard Runtime Manager uses WebSockets to communicate with Lightning.\n\nHowever, since the workers are treated no differently from any other incoming\ntraffic; there are two layers of security applied to anything that can access\nyour data or process work.\n\nWe use two different JWTs to facilitate the follow:\n\n#","ref":"workers.html#connecting-workers-to-lightning"},{"type":"extras","title":"Worker Token - Workers","doc":"This token is created by the worker and signed with a shared HS256 secret that\nLightning uses to verify.\n\n#","ref":"workers.html#worker-token"},{"type":"extras","title":"Run Token - Workers","doc":"This token is created by Lightning for every Run that a worker receives. The\ntoken is signed with a private key, and therefore cannot be generated by 3rd\nparties.\n\nThe token is scoped for a single Run and cannot be used to access anything\noutside of the scope of that Run.","ref":"workers.html#run-token"},{"type":"extras","title":"Generating Keys - Workers","doc":"Lightning comes with a mix task to help generate keys:\n\n```\nmix lightning.gen_worker_keys\n```","ref":"workers.html#generating-keys"},{"type":"extras","title":"Configuring Lightning and Workers - Workers","doc":"There are three environment variables required to make everything work.\n\n**`WORKER_RUNS_PRIVATE_KEY`**\n\n_Lightning only_\n\nA Base64 encoded private key in PEM format, used to generate JWTs granting\nworkers permission to access a specific Run, the related Workflow and\ncredentials.\n\n> [!IMPORTANT] This key should never be shared. If you suspect it has been\n> compromised, generate a new one and reconfigure both Lightning and your\n> workers.\n\n**`WORKER_SECRET`**\n\n_Lightning and Workers_\n\nA 256bit long shared secret used by the worker to sign JWTs for authentication\nwith the Lightning API.\n\n**`WORKER_LIGHTNING_PUBLIC_KEY`**\n\n_Workers only_\n\nA Base64 encoded public key in PEM format derived from the private key. This is\nused by workers to verify Run Tokens coming from Lightning.","ref":"workers.html#configuring-lightning-and-workers"},{"type":"extras","title":"Troubleshooting - Workers","doc":"#","ref":"workers.html#troubleshooting"},{"type":"extras","title":"Problems with NodeJS DNS name resolution - Workers","doc":"NodeJS v17 [changed](https://github.com/nodejs/node/pull/39987) how DNS name\nresolution is handled. In earlier versions, Node would reorder DNS lookup\nresults so IPv4 addresses came before IPv6 addresses. In v17, Node started\nreturning addresses in the same order provided by the resolver. The net effect\nis that your workers might fail to connect to Lightning if the native DNS\nresolver on your system is returning the loopback IPv6 address (`::1`) before\nthe IPv4 address (`127.0.0.1`). In these cases, your worker might report an\nerror similar to the following:\n\n```\nCRITICAL ERROR: could not connect to lightning at ws://localhost:4000/worker\n```\n\nIf you experience this, it can be helpful to set the `NODE_OPTIONS` environment\nvariable as shown below. This will force pre-v17 behavior of returning IPv4\naddresses first.\n\n```\nNODE_OPTIONS=--dns-result-order=ipv4first\n```\n\nYou can directly inspect what IP address Node returns for `localhost` by running\nthe following command:\n\n```\nnode -e 'dns.lookup(\"localhost\", console.log)'\n```","ref":"workers.html#problems-with-nodejs-dns-name-resolution"},{"type":"extras","title":"Provisioning","doc":"# Provisioning\n\nLightning offers the ability to configure projects via the HTTP API.\n\nBy providing a JSON document with the desired configuration, the project can be\nconfigured to your liking.","ref":"provisioning.html"},{"type":"extras","title":"Using the API - Provisioning","doc":"The API is available at `/api/provision`, and expects an `application/json`\nContent-Type.\n\n#","ref":"provisioning.html#using-the-api"},{"type":"extras","title":"Authentication - Provisioning","doc":"The API requires a valid auth token to be provided in the `Authorization`\nheader.\n\n#","ref":"provisioning.html#authentication"},{"type":"extras","title":"Example Request - Provisioning","doc":"```bash\n curl -X POST \\\n -d @project.json \\\n -H \"Authorization: Bearer $TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n $ENDPOINT/api/provision\n```","ref":"provisioning.html#example-request"},{"type":"extras","title":"Document Structure - Provisioning","doc":"The provisioning document is a JSON document with the project at the root.\n\n> All entities **must have** an `id` field, which is a UUIDv4 string. In the\n> case of new entities, this must be generated by the client.\n\nThe API is idempotent, and the distinction between creating and updating is\ndetermined by the presence of the `id` field.\n\n```jsonc\n{\n \"id\": \" >\",\n \"name\": \" >\",\n \"workflows\": [\n {\n \"id\": \" >\",\n \"name\": \" >\",\n \"jobs\": [\n {\n \"id\": \" >\",\n \"name\": \" >\",\n \"body\": \" >\",\n \"adaptor\": \" >\",\n \"enabled\": true\n }\n // ... more jobs\n ],\n \"triggers\": [\n {\n \"id\": \" >\",\n \"name\": \" >\",\n \"type\": \"webhook\"\n }\n // ... more triggers\n ],\n \"edges\": [\n {\n \"id\": \" >\",\n \"source_trigger_id\": \" >\",\n \"target_job_id\": \" >\"\n }\n // ... more edges\n ]\n }\n // ... more workflows\n ]\n}\n```","ref":"provisioning.html#document-structure"},{"type":"extras","title":"API Behaviour - Provisioning","doc":"The API expects **all** existing entities to be provided in the provisioning\ndocument.\n\nIf the document provided is out of date (e.g. a new job was added on the\nserver), a new reference document should be fetched and the changes applied to\nit.\n\n#","ref":"provisioning.html#api-behaviour"},{"type":"extras","title":"Deleting Entities - Provisioning","doc":"Entities can be deleted by setting the `disabled` key to `true`.\n\nExample:\n\n```jsonc\n{\n \"id\": \" >\",\n \"workflows\": [\n {\n \"id\": \" >\",\n \"jobs\": [\n {\n \"id\": \" >\",\n \"delete\": true // <== delete this job\n }\n ]\n }\n ]\n}\n```","ref":"provisioning.html#deleting-entities"},{"type":"extras","title":"Relationship with Projects as Code - Provisioning","doc":"The Projects as Code spec is a superset of the provisioning API.\n\nProjects as Code allows for the user to specify a key for each entity, which\nmakes it easier to manage the project in the future.\n\nFor example:\n\n```yaml\nname: my-project\nworkflows:\n workflow-one:\n jobs:\n job-one:\n body: |\n console.log(\"Hello World\");\n adaptor: '@openfn/language-common'\n enabled: true\n triggers:\n trigger-one:\n type: webhook\n edges:\n - source_trigger: trigger-one\n target_job: job-one\n```\n\nThe above YAML document illustrates the use of keys being used to identify\nentities. Allowing the user to provision the same project to multiple\nenvironments.\n\nThe API is unaware of 'keys', and expects IDs to be provided by the client.\n\nIn order to convert the above YAML document to a provisioning document, the CLI\nuses a local state file (if available) to map the keys to UUIDs.\n\nUsing the example above a state file might look like this:\n\n```jsonc\n{\n \"id\": \"f6ba9a8c-b687-473a-908e-e250686f1eed\",\n \"workflows\": {\n \"workflow-one\": {\n \"id\": \"f206aa85-4fce-492e-94eb-ffd32c75d178\",\n \"jobs\": {},\n \"triggers\": {}\n }\n }\n}\n```\n\nThe state file shows that the project and workflow already exist, but the job,\ntrigger and edge do not. In order to create these new entities, IDs will be\napplied them.\n\nOn a successful application of the provisioning document, the state file will be\nupdated to reflect the new IDs and entities.\n\n```json\n{\n \"id\": \"f6ba9a8c-b687-473a-908e-e250686f1eed\",\n \"workflows\": {\n \"workflow-one\": {\n \"id\": \"f206aa85-4fce-492e-94eb-ffd32c75d178\",\n \"jobs\": {\n \"job-one\": { \"id\": \"18ed71de-caf8-4822-aefc-5b19351f4016\" }\n },\n \"triggers\": {\n \"trigger-one\": { \"id\": \"e0b9f357-9cf9-4206-9924-4d5674aad830\" }\n },\n \"edges\": [\n {\n \"id\": \"c239d994-6662-4637-90f8-0293c924b461\",\n \"source_trigger_id\": \"e0b9f357-9cf9-4206-9924-4d5674aad830\",\n \"target_job_id\": \"18ed71de-caf8-4822-aefc-5b19351f4016\"\n }\n ]\n }\n }\n}\n```","ref":"provisioning.html#relationship-with-projects-as-code"},{"type":"extras","title":"Changelog","doc":"# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n- `Added` for new features.\n- `Changed` for changes in existing functionality.\n- `Deprecated` for soon-to-be removed features.\n- `Removed` for now removed features.\n- `Fixed` for any bug fixes.\n- `Security` in case of vulnerabilities.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to\n[Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n#","ref":"changelog.html"},{"type":"extras","title":"Added - Changelog","doc":"#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Make project description multiline in project.yaml\n [#2534](https://github.com/OpenFn/lightning/issues/2534)\n- Do not track partition timestamps when ingesting Kafka messages.\n [#2531](https://github.com/OpenFn/lightning/issues/2531)\n- Always use the `initial_offset_reset_policy` when enabling a Kafka pipeline.\n [#2531](https://github.com/OpenFn/lightning/issues/2531)\n- Add plumbing to simulate a persistence failure in a Kafka trigger pipeline.\n [#2386](https://github.com/OpenFn/lightning/issues/2386)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix Oban erros not getting logged in Sentry\n [#2542](https://github.com/OpenFn/lightning/issues/2542)\n- Perform data retention purging in batches to avoid timeouts\n [#2528](https://github.com/OpenFn/lightning/issues/2528)\n- Fix editor panel title gets pushed away when collapsed\n [#2545](https://github.com/OpenFn/lightning/issues/2545)\n- Mark unfinished steps having finished runs as `lost`\n [#2416](https://github.com/OpenFn/lightning/issues/2416)\n\n## [v2.9.8] - 2024-10-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Ability for users to to retry Runs and create manual Work Orders from the job\n inspector #2496 [#2496](https://github.com/OpenFn/lightning/issues/2496)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix panel icons overlays on top title when collapsed\n [#2537](https://github.com/OpenFn/lightning/issues/2537)\n\n## [v2.9.7] - 2024-10-02\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Enqueues many work orders retries in the same transaction per Oban job.\n [#2363](https://github.com/OpenFn/lightning/issues/2363)\n- Added the ability to retry rejected work orders.\n [#2391](https://github.com/OpenFn/lightning/issues/2391)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Notify other present users when the promoted user saves the workflow\n [#2282](https://github.com/OpenFn/lightning/issues/2282)\n- User email change: Add debounce on blur to input forms to avoid validation\n after every keystroke [#2365](https://github.com/OpenFn/lightning/issues/2365)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Use timestamps sent from worker when starting and completing runs\n [#2434](https://github.com/OpenFn/lightning/issues/2434)\n- User email change: Add debounce on blur to input forms to avoid validation\n after every keystroke [#2365](https://github.com/OpenFn/lightning/issues/2365)\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- User email change: Send notification of change to the old email address and\n confirmation to the new email address\n [#2365](https://github.com/OpenFn/lightning/issues/2365)\n- Fixes filters to properly handle the \"rejected\" status for work orders.\n [#2391](https://github.com/OpenFn/lightning/issues/2391)\n- Fix item selection (project / billing account) in the context switcher\n [#2518](https://github.com/OpenFn/lightning/issues/2518)\n- Export edge condition expressions as multiline in project spec\n [#2521](https://github.com/OpenFn/lightning/issues/2521)\n- Fix line spacing on AI Assistant\n [#2498](https://github.com/OpenFn/lightning/issues/2498)\n\n## [v2.9.6] - 2024-09-23\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Increase minimum password length to 12 in accordance with ASVS 4.0.3\n recommendation V2.1.2 [#2507](https://github.com/OpenFn/lightning/pull/2507)\n- Changed the public sandbox (https://demo.openfn.org) setup script to use\n `welcome12345` passwords to comply with a 12-character minimum\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Dataclip selector always shows that the dataclip is wiped even when the job\n wasn't run [#2303](https://github.com/OpenFn/lightning/issues/2303)\n- Send run channel errors to sentry\n [#2515](https://github.com/OpenFn/lightning/issues/2515)\n\n## [v2.9.5] - 2024-09-18\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Hide export history button when no workorder is rendered in the table\n [#2440](https://github.com/OpenFn/lightning/issues/2440)\n- Improve docs for running lightning locally #2499\n [#2499](https://github.com/OpenFn/lightning/pull/2499)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix empty webhook URL when switching workflow trigger type\n [#2050](https://github.com/OpenFn/lightning/issues/2050)\n- Add quotes when special YAML characters are present in the exported project\n [#2446](https://github.com/OpenFn/lightning/issues/2446)\n- In the AI Assistant, don't open the help page when clicking the Responsible AI\n Link [#2511](https://github.com/OpenFn/lightning/issues/2511)\n\n## [v2.9.4] - 2024-09-16\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Responsible AI review of AI Assistant\n [#2478](https://github.com/OpenFn/lightning/pull/2478)\n- Improve history export page UI\n [#2442](https://github.com/OpenFn/lightning/issues/2442)\n- When selecting a node in the workflow diagram, connected edges will also be\n highlighted [#2396](https://github.com/OpenFn/lightning/issues/2358)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix AI Assitant crashes on a job that is not saved yet\n [#2479](https://github.com/OpenFn/lightning/issues/2479)\n- Fix jumpy combobox for scope switcher\n [#2469](https://github.com/OpenFn/lightning/issues/2469)\n- Fix console errors when rending edge labels in the workflow diagram\n- Fix tooltip on export workorder button\n [#2430](https://github.com/OpenFn/lightning/issues/2430)\n\n## [v2.9.3] - 2024-09-11\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add utility module to seed a DB to support query performance analysis.\n [#2441](https://github.com/OpenFn/lightning/issues/2441)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Enhance user profile page to add a section for updating basic information\n [#2470](https://github.com/OpenFn/lightning/pull/2470)\n- Upgraded Heroicons to v2.1.5, from v2.0.18\n [#2483](https://github.com/OpenFn/lightning/pull/2483)\n- Standardize `link-uuid` style for uuid chips\n- Updated PromEx configuration to align with custom Oban naming.\n [#2488](https://github.com/OpenFn/lightning/issues/2488)\n\n## [v2.9.2] - 2024-09-09\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Temporarily limit AI to @openfn emails while testing\n [#2482](https://github.com/OpenFn/lightning/pull/2482)\n\n## [v2.9.1] - 2024-09-09\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Provisioner creates invalid snapshots when doing CLI deploy\n [#2461](https://github.com/OpenFn/lightning/issues/2461)\n [#2460](https://github.com/OpenFn/lightning/issues/2460)\n\n > This is a fix for future Workflow updates that are deployed by the CLI and\n > Github integrations. Unfortunately, there is a high likelihood that your\n > existing snapshots could be incorrect (e.g. missing steps, missing edges).\n > In order to fix this, you will need to manually create new snapshots for\n > each of your workflows. This can be done either by modifying the workflow in\n > the UI and saving it. Or running a command on the running instance:\n >\n > ```elixir\n > alias Lightning.Repo\n > alias Lightning.Workflows.{Workflow, Snapshot}\n >\n > Repo.transaction(fn ->\n > snapshots =\n > Repo.all(Workflow)\n > |> Enum.map(&Workflow.touch/1)\n > |> Enum.map(&Repo.update!/1)\n > |> Enum.map(fn workflow ->\n > {:ok, snapshot} = Snapshot.create(workflow)\n > snapshot\n > end)\n >\n > {:ok, snapshots}\n > end)\n > ```\n\n## [v2.9.0] - 2024-09-06\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Limit AI queries and hook the increment of AI queries to allow usage limiting.\n [#2438](https://github.com/OpenFn/lightning/pull/2438)\n- Persist AI Assistant conversations and enable it for all users\n [#2296](https://github.com/OpenFn/lightning/issues/2296)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Rename `new_table` component to `table`.\n [#2448](https://github.com/OpenFn/lightning/pull/2448)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix `workflow_id` presence in state.json during Github sync\n [#2445](https://github.com/OpenFn/lightning/issues/2445)\n\n## [v2.8.2] - 2024-09-04\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Change navbar colors depending on scope.\n [#2449](https://github.com/OpenFn/lightning/pull/2449)\n- Add support for configurable idle connection timeouts via the `IDLE_TIMEOUT`\n environment variable. [#2443](https://github.com/OpenFn/lightning/issues/2443)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Allow setup_user command to be execute from outside the container with\n `/app/bin/lightning eval Lightning.Setup.setup_user/3`\n- Implement a combo-box to make navigating between projects easier\n [#241](https://github.com/OpenFn/lightning/pull/2424)\n- Updated vulnerable version of micromatch.\n [#2454](https://github.com/OpenFn/lightning/issues/2454)\n\n## [v2.8.1] - 2024-08-28\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Improve run claim query by removing extraneous sorts\n [#2431](https://github.com/OpenFn/lightning/issues/2431)\n\n## [v2.8.0] - 2024-08-27\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Users are now able to export work orders, runs, steps, logs, and dataclips\n from the History page.\n [#1698](https://github.com/OpenFn/lightning/issues/1698)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Add index over `run_id` and `step_id` in run_steps to improve worker claim\n speed. [#2428](https://github.com/OpenFn/lightning/issues/2428)\n- Show Github Error messages as they are to help troubleshooting\n [#2156](https://github.com/OpenFn/lightning/issues/2156)\n- Allow `Setup_utils.setup_user` to be used for the initial superuser creation.\n- Update to code assist in the Job Editor to import namespaces from adaptors.\n [#2432](https://github.com/OpenFn/lightning/issues/2432)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Unable to remove/reconnect github app in lightning after uninstalling directly\n from Github [#2168](https://github.com/OpenFn/lightning/issues/2168)\n- Github sync buttons available even when usage limiter returns error\n [PR#2390](https://github.com/OpenFn/lightning/pull/2390)\n- Fix issue with the persisting of a Kafka message with headers.\n [#2402](https://github.com/OpenFn/lightning/issues/2402)\n- Protect against race conditions when updating partition timestamps for a Kafka\n trigger. [#2378](https://github.com/OpenFn/lightning/issues/2378)\n\n## [v2.7.19] - 2024-08-19\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Pass the user_id param on check usage limits.\n [#2387](https://github.com/OpenFn/lightning/issues/2387)\n\n## [v2.7.18] - 2024-08-17\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Added - Changelog","doc":"- Ensure that all users in an instance have a confirmed email address within 48\n hours [#2389](https://github.com/OpenFn/lightning/issues/2389)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Ensure that all the demo accounts are confirmed by default\n [#2395](https://github.com/OpenFn/lightning/issues/2395)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Removed all Kafka trigger code that ensured that message sequence is honoured\n for messages with keys. Functionality to ensure that message sequence is\n honoured will be added in the future, but in an abstraction that is a better\n fit for the current Lightning design.\n [#2362](https://github.com/OpenFn/lightning/issues/2362)\n- Dropped the `trigger_kafka_messages` table that formed part of the Kafka\n trigger implementation, but which is now obsolete given the removal of the\n code related to message sequence preservation.\n [#2362](https://github.com/OpenFn/lightning/issues/2362)\n\n## [v2.7.17] - 2024-08-14\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added an `iex` command to setup a user, an apiToken, and credentials so that\n it's possible to get a fully running lightning instance via external shell\n script. (This is a tricky requirement for a distributed set of local\n deployments) [#2369](https://github.com/OpenFn/lightning/issues/2369) and\n [#2373](https://github.com/OpenFn/lightning/pull/2373)\n- Added support for _very basic_ project-credential management (add, associate\n with job) via provisioning API.\n [#2367](https://github.com/OpenFn/lightning/issues/2367)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Enforced uniqueness on credential names _by user_.\n [#2371](https://github.com/OpenFn/lightning/pull/2371)\n- Use Swoosh to format User models into recipients\n [#2374](https://github.com/OpenFn/lightning/pull/2374)\n- Bump default CLI to `@openfn/cli@1.8.1`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- When a Workflow is deleted, any associated Kafka trigger pipelines will be\n stopped and deleted. [#2379](https://github.com/OpenFn/lightning/issues/2379)\n\n## [v2.7.16] - 2024-08-07\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- @ibrahimwickama fixed issue that prevented users from creating new workflows\n if they are running in an `http` environment (rather than `localhost` or\n `https`). [#2365](https://github.com/OpenFn/lightning/pull/2356)\n\n## [v2.7.15] - 2024-08-07\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Kafka messages without keys are synchronously converted into a Workorder,\n Dataclip and Run. Messages with keys are stored as TriggerKafkaMessage\n records, however the code needed to process them has been disabled, pending\n removal. [#2351](https://github.com/OpenFn/lightning/issues/2351)\n\n## [v2.7.14] - 2024-08-05\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Use standard styles for link, fix home button in breadcrumbs\n [#2354](https://github.com/OpenFn/lightning/pull/2354)\n\n## [v2.7.13] - 2024-08-05\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Don't log 406 Not Acceptable errors to Sentry\n [#2350](https://github.com/OpenFn/lightning/issues/2350)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Correctly handle floats in LogMessage\n [#2348](https://github.com/OpenFn/lightning/issues/2348)\n\n## [v2.7.12] - 2024-07-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Make root layout configurable\n [#2310](https://github.com/OpenFn/lightning/pull/2310)\n- Use snapshots when initiating Github Sync\n [#1827](https://github.com/OpenFn/lightning/issues/1827)\n- Move runtime logic into module\n [#2338](https://github.com/OpenFn/lightning/pull/2338)\n- Use `AccountHook Extension` to register new users invited in a project\n [#2341](https://github.com/OpenFn/lightning/pull/2341)\n- Standardized top bars across the UI with a navigable breadcrumbs interface\n [#2299](https://github.com/OpenFn/lightning/pull/2299)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Limit frame size of worker socket connections\n [#2339](https://github.com/OpenFn/lightning/issues/2339)\n- Limit number of days to 31 in cron trigger dropdown\n [#2331](https://github.com/OpenFn/lightning/issues/2331)\n\n## [v2.7.11] - 2024-07-26\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Expose more Kafka configuration at instance-level.\n [#2329](https://github.com/OpenFn/lightning/issues/2329)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Table action css tweaks\n [#2333](https://github.com/OpenFn/lightning/issues/2333)\n\n## [v2.7.10]\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- A rudimentary optimisation for Kafka messages that do not have a key as the\n sequence of these messages can not be guaranteed.\n [#2323](https://github.com/OpenFn/lightning/issues/2323)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix an intermittent bug when trying to intern Kafka offset reset policy.\n [#2327](https://github.com/OpenFn/lightning/issues/2327)\n\n## [v2.7.9] - 2024-07-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- CSS - standardized some more tailwind components\n [PR#2324](https://github.com/OpenFn/lightning/pull/2324)\n\n## [v2.7.8] - 2024-07-24\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Enable End to End Integration tests\n [#2187](https://github.com/OpenFn/lightning/issues/2187)\n- Make selected Kafka trigger parameters configurable via ENV vars.\n [#2315](https://github.com/OpenFn/lightning/issues/2315)\n- Use the Oauth2 `revocation_endpoint` to revoke token access (1) before\n attempting to reauthorize and (2) when users schedule a credential for\n deletion [#2314](https://github.com/OpenFn/lightning/issues/2314)\n- Standardized tailwind alerts\n [#2314](https://github.com/OpenFn/lightning/issues/2314)\n- Standardized `link` tailwind style (and provided `link-plain`, `link-info`,\n `link-error`, and `link-warning`)\n [#2314](https://github.com/OpenFn/lightning/issues/2314)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix work order URL in failure alerts\n [#2305](https://github.com/OpenFn/lightning/pull/2305)\n- Fix error when handling existing encrypted credentials\n [#2316](https://github.com/OpenFn/lightning/issues/2316)\n- Fix job editor switches to the snapshot version when body is changed\n [#2306](https://github.com/OpenFn/lightning/issues/2306)\n- Fix misaligned \"Retry from here\" button on inspector page\n [#2308](https://github.com/OpenFn/lightning/issues/2308)\n\n## [v2.7.7] - 2024-07-18\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add experimental support for triggers that consume message from a Kafka\n cluster [#1801](https://github.com/OpenFn/lightning/issues/1801)\n- Workflows can now specify concurrency, allowing runs to be executed\n syncronously or to a maximum concurrency level. Note that this applies to the\n default FifoRunQueue only.\n [#2022](https://github.com/OpenFn/lightning/issues/2022)\n- Invite Non-Registered Users to a Project\n [#2288](https://github.com/OpenFn/lightning/pull/2288)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Make modal close events configurable\n [#2298](https://github.com/OpenFn/lightning/issues/2298)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Prevent Oauth credentials from being created if they don't have a\n `refresh_token` [#2289](https://github.com/OpenFn/lightning/pull/2289) and\n send more helpful error data back to the worker during token refresh failure\n [#2135](https://github.com/OpenFn/lightning/issues/2135)\n- Fix CLI deploy not creating snapshots for workflows\n [#2271](https://github.com/OpenFn/lightning/issues/2271)\n\n## [v2.7.6] - 2024-07-11\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- UsageTracking crons are enabled again (if config is enabled)\n [#2276](https://github.com/OpenFn/lightning/issues/2276)\n- UsageTracking metrics absorb the fact that a step's job_id may not currently\n exist when counting unique jobs\n [#2279](https://github.com/OpenFn/lightning/issues/2279)\n- Adjusted layout and text displayed when preventing simultaneous edits to\n accommodate more screen sizes\n [#2277](https://github.com/OpenFn/lightning/issues/2277)\n\n## [v2.7.5] - 2024-07-10\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Prevent two editors from making changes to the same workflow at the same time\n [#1949](https://github.com/OpenFn/lightning/issues/1949)\n- Moved the Edge Condition Label field to the top of the form, so it's always\n visible [#2236](https://github.com/OpenFn/lightning/pull/2236)\n- Update edge condition labels in the Workflow Diagram to always show the\n condition type icon and the label\n [#2236](https://github.com/OpenFn/lightning/pull/2236)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Do Not Require Lock Version In URL Parameters\n [#2267](https://github.com/OpenFn/lightning/pull/2267)\n- Trim erroneous spaces on user first and last names\n [#2269](https://github.com/OpenFn/lightning/pull/2269)\n\n## [v2.7.4] - 2024-07-06\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- When the entire log string is a valid JSON object, pretty print it with a\n standard `JSON.stringify(str, null, 2)` but if it's something else then let\n the user do whatever they want (e.g., if you write\n `console.log('some', 'cool', state.data)` we won't mess with it.)\n [#2260](https://github.com/OpenFn/lightning/pull/2260)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed sticky toggle button for switching between latest version and a snapshot\n of a workflow [#2264](https://github.com/OpenFn/lightning/pull/2264)\n\n## [v2.7.3] - 2024-07-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped the ws-worker to v1.3\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix issue when selecting different steps in RunViewer and the parent liveview\n not being informed [#2253](https://github.com/OpenFn/lightning/issues/2253)\n- Stopped inspector from crashing when looking for a step by a run/job\n combination [#2201](https://github.com/OpenFn/lightning/issues/2201)\n- Workflow activation only considers new and changed workflows\n [#2237](https://github.com/OpenFn/lightning/pull/2237)\n\n## [v2.7.2] - 2024-07-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Allow endpoint plugs to be injected at compile time.\n [#2248](https://github.com/OpenFn/lightning/pull/2248)\n- All models to use the `public` schema.\n [#2249](https://github.com/OpenFn/lightning/pull/2249)\n- In the workflow diagram, smartly update the view when adding new nodes\n [#2174](https://github.com/OpenFn/lightning/issues/2174)\n- In the workflow diagram, remove the \"autofit\" toggle in the control bar\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Remove prompt parameter from the authorization URL parameters for the Generic\n Oauth Clients [#2250](https://github.com/OpenFn/lightning/issues/2250)\n- Fixed react key error [#2233](https://github.com/OpenFn/lightning/issues/2233)\n- Show common functions in the Docs panel\n [#1733](https://github.com/OpenFn/lightning/issues/1733)\n\n## [v2.7.1] - 2024-07-01\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Update email copies [#2213](https://github.com/OpenFn/lightning/issues/2213)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix jumpy cursor in the Job editor.\n [#2229](https://github.com/OpenFn/lightning/issues/2229)\n- Rework syncing behaviour to prevent changes getting thrown out on a socket\n reconnect. [#2007](https://github.com/OpenFn/lightning/issues/2007)\n\n## [v2.7.0] - 2024-06-26\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Use of snapshots for displaying runs and their associated steps in the History\n page. [#1825](https://github.com/OpenFn/lightning/issues/1825)\n- Added view-only mode for rendering workflows and runs in the Workflow Canvas\n and the Inspector page using snapshots, with the option to switch between a\n specific snapshot version and the latest version. Edit mode is available when\n displaying the latest version.\n [#1843](https://github.com/OpenFn/lightning/issues/1843)\n- Allow users to delete steps sssociated with runs in the Workflow Canvas\n [#2027](https://github.com/OpenFn/lightning/issues/2027)\n- Link to adaptor `/src` from inspector.\n- Prototype AI Assistant for working with job code.\n [#2193](https://github.com/OpenFn/lightning/issues/2193)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Reverted behaviour on \"Rerun from here\" to select the Log tab.\n [#2202](https://github.com/OpenFn/lightning/issues/2202)\n- Don't allow connections between an orphaned node and a\n Trigger[#2188](https://github.com/OpenFn/lightning/issues/2188)\n- Reduce the minimum zoom in the workflow diagram\n [#2214](https://github.com/OpenFn/lightning/issues/2214)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix some adaptor docs not displaying\n [#2019](https://github.com/OpenFn/lightning/issues/2019)\n- Fix broken `mix lightning.install_adaptor_icons` task due to addition of Finch\n http client change.\n\n## [v2.6.3] - 2024-06-19\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Added a notice on application start about anonymous public impact reporting\n and its importance for the sustainability of\n [Digital Public Goods](https://digitalpublicgoods.net/) and\n [Digital Public Infrastructure](https://www.codevelop.fund/insights-1/what-is-digital-public-infrastructure).\n- Increase default `WORKER_MAX_RUN_DURATION_SECONDS` to 300 to match the\n [ws-worker default](https://github.com/OpenFn/kit/blob/main/packages/ws-worker/src/util/cli.ts#L149-L153)\n so if people don't set their timeout via ENV, at least the two match up.\n\n## [v2.6.2] - 2024-06-13\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix vanishing Docs panel when Editor panel is collapsed and opened again\n [#2195](https://github.com/OpenFn/lightning/issues/2195)\n- Maintain tab when RunViewer remounts/push state drops tab hash\n [#2199](https://github.com/OpenFn/lightning/issues/2199)\n\n## [v2.6.1] - 2024-06-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Erlang to 26.2.5\n- Update debian bookworm from 20240130 to 20240513.\n- Return 403s when Provisioning API fails because of usage limits\n [#2182](https://github.com/OpenFn/lightning/pull/2182)\n- Update email notification for changing retention period\n [#2066](https://github.com/OpenFn/lightning/issues/2066)\n- Return 415s when Webhooks are sent Content-Types what are not supported.\n [#2180](https://github.com/OpenFn/lightning/issues/2180)\n- Updated the default step text\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Rewrite TabSelector (now Tabbed) components fixing a number of navigation\n issues [#2051](https://github.com/OpenFn/lightning/issues/2051)\n\n## [v2.6.0] - 2024-06-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Support multiple edges leading to the same step (a.k.a., \"drag & drop\")\n [#2008](https://github.com/OpenFn/lightning/issues/2008)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"## [v2.5.5] - 2024-06-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Replace LiveView Log Viewer component with React Monaco\n [#1863](https://github.com/OpenFn/lightning/issues/1863)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bump default CLI to `@openfn/cli@1.3.2`\n- Don't show deprecated adaptor versions in the adaptor version picklist (to be\n followed by some graceful deprecation handling/warning in\n [later work](https://github.com/OpenFn/lightning/issues/2172))\n [#2169](https://github.com/OpenFn/lightning/issues/2169)\n- Refactor count workorders to reuse search code\n [#2121](https://github.com/OpenFn/lightning/issues/2121)\n- Updated provisioning error message to include workflow and job names\n [#2140](https://github.com/OpenFn/lightning/issues/2140)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Don't let two deploy workflows run at the same time to prevent git collisions\n [#2044](https://github.com/OpenFn/lightning/issues/2044)\n- Stopped sending emails when creating a starter project\n [#2161](https://github.com/OpenFn/lightning/issues/2161)\n\n## [v2.5.4] - 2024-05-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- CORS support [#2157](https://github.com/OpenFn/lightning/issues/2157)\n- Track users emails preferences\n [#2163](https://github.com/OpenFn/lightning/issues/2163)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Change Default Text For New Job Nodes\n [#2014](https://github.com/OpenFn/lightning/pull/2014)\n- Persisted run options when runs are _created_, not when they are _claimed_.\n This has the benefit of \"locking in\" the behavior desired by the user at the\n time they demand a run, not whenever the worker picks it up.\n [#2085](https://github.com/OpenFn/lightning/pull/2085)\n- Made `RUN_GRACE_PERIOD_SECONDS` a configurable ENV instead of 20% of the\n `WORKER_MAX_RUN_DURATION`\n [#2085](https://github.com/OpenFn/lightning/pull/2085)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Stopped Janitor from calling runs lost if they have special runtime options\n [#2079](https://github.com/OpenFn/lightning/issues/2079)\n- Dataclip Viewer now responds to page resize and internal page layout\n [#2120](https://github.com/OpenFn/lightning/issues/2120)\n\n## [v2.5.3] - 2024-05-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Stop users from creating deprecated Salesforce and GoogleSheets credentials.\n [#2142](https://github.com/OpenFn/lightning/issues/2142)\n- Delegate menu customization and create menu components for reuse.\n [#1988](https://github.com/OpenFn/lightning/issues/1988)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Disable Credential Save Button Until All Form Fields Are Validated\n [#2099](https://github.com/OpenFn/lightning/issues/2099)\n- Fix Credential Modal Closure Error When Workflow Is Unsaved\n [#2101](https://github.com/OpenFn/lightning/pull/2101)\n- Fix error when socket reconnects and user is viewing a run via the inspector\n [#2148](https://github.com/OpenFn/lightning/issues/2148)\n\n## [v2.5.2] - 2024-05-23\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Preserve custom values (like `apiVersion`) during token refresh for OAuth2\n credentials [#2131](https://github.com/OpenFn/lightning/issues/2131)\n\n## [v2.5.1] - 2024-05-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Don't compile Phoenix Storybook in production and test environments\n [#2119](https://github.com/OpenFn/lightning/pull/2119)\n- Improve performance and memory consumption on queries and logic for digest\n mailer [#2121](https://github.com/OpenFn/lightning/issues/2121)\n\n## [v2.5.0] - 2024-05-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- When a refresh token is updated, save it!\n [#2124](https://github.com/OpenFn/lightning/pull/2124)\n\n## [v2.5.0-pre4] - 2024-05-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix duplicate credential type bug\n [#2100](https://github.com/OpenFn/lightning/issues/2100)\n- Ensure Global OAuth Clients Accessibility for All Users\n [#2114](https://github.com/OpenFn/lightning/issues/2114)\n\n## [v2.5.0-pre3] - 2024-05-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix credential not added automatically after being created from the canvas.\n [#2105](https://github.com/OpenFn/lightning/issues/2105)\n- Replace the \"not working?\" prompt by \"All good, but if your credential stops\n working, you may need to re-authorize here.\".\n [#2102](https://github.com/OpenFn/lightning/issues/1872)\n- Fix Generic Oauth credentials don't get included in the refresh flow\n [#2106](https://github.com/OpenFn/lightning/pull/2106)\n\n## [v2.5.0-pre2] - 2024-05-17\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Replace LiveView Dataclip component with React Monaco bringing large\n performance improvements when viewing large dataclips.\n [#1872](https://github.com/OpenFn/lightning/issues/1872)\n\n## [v2.5.0-pre] - 2024-05-17\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow users to build Oauth clients and associated credentials via the user\n interface. [#1919](https://github.com/OpenFn/lightning/issues/1919)\n\n## [v2.4.14] - 2024-05-16\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Refactored image and version info\n [#2097](https://github.com/OpenFn/lightning/pull/2097)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue where updating adaptor name and version of job node in the\n workflow canvas crashes the app when no credential is selected\n [#99](https://github.com/OpenFn/lightning/issues/99)\n- Removes stacked viewer after switching tabs and steps.\n [#2064](https://github.com/OpenFn/lightning/issues/2064)\n\n## [v2.4.13] - 2024-05-16\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue where updating an existing Salesforce credential to use a\n `sandbox` endpoint would not properly re-authenticate.\n [#1842](https://github.com/OpenFn/lightning/issues/1842)\n- Navigate directly to settings from url hash and renders default panel when\n there is no hash. [#1971](https://github.com/OpenFn/lightning/issues/1971)\n\n## [v2.4.12] - 2024-05-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix render settings default panel on first load\n [#1971](https://github.com/OpenFn/lightning/issues/1971)\n\n## [v2.4.11] - 2024-05-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Upgraded Sentry to v10 for better error reporting.\n\n## [v2.4.10] - 2024-05-14\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix the \"reset demo\" script by disabling the emailing that was introduced to\n the `create_project` function.\n [#2063](https://github.com/OpenFn/lightning/pull/2063)\n\n## [v2.4.9] - 2024-05-14\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped @openfn/ws-worker to 1.1.8\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Correctly pass max allowed run time into the Run token, ensuring it's valid\n for the entirety of the Runs execution time\n [#2072](https://github.com/OpenFn/lightning/issues/2072)\n\n## [v2.4.8] - 2024-05-13\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add Github sync to usage limiter\n [#2031](https://github.com/OpenFn/lightning/pull/2031)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Remove illogical cancel buttons on user/pass change screen\n [#2067](https://github.com/OpenFn/lightning/issues/2067)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Stop users from configuring failure alerts when the limiter returns error\n [#2076](https://github.com/OpenFn/lightning/pull/2076)\n\n## [v2.4.7] - 2024-05-11\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed early worker token expiry bug\n [#2070](https://github.com/OpenFn/lightning/issues/2070)\n\n## [v2.4.6] - 2024-05-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow for automatic resubmission of failed usage tracking report submissions.\n [1789](https://github.com/OpenFn/lightning/issues/1789)\n- Make signup feature configurable\n [#2049](https://github.com/OpenFn/lightning/issues/2049)\n- Apply runtime limits to worker execution\n [#2015](https://github.com/OpenFn/lightning/pull/2015)\n- Limit usage for failure alerts\n [#2011](https://github.com/OpenFn/lightning/pull/2011)\n\n## [v2.4.5] - 2024-05-07\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix provioning API calls workflow limiter without the project ID\n [#2057](https://github.com/OpenFn/lightning/issues/2057)\n\n## [v2.4.4] - 2024-05-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Benchmarking script that simulates data from a cold chain.\n [#1993](https://github.com/OpenFn/lightning/issues/1993)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Changed Snapshot `get_or_create_latest_for` to accept multis allow controlling\n of which repo it uses.\n- Require exactly one owner for each project\n [#1991](https://github.com/OpenFn/lightning/issues/1991)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue preventing credential updates\n [#1861](https://github.com/OpenFn/lightning/issues/1861)\n\n## [v2.4.3] - 2024-05-01\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow menu items customization\n [#1988](https://github.com/OpenFn/lightning/issues/1988)\n- Workflow Snapshot support\n [#1822](https://github.com/OpenFn/lightning/issues/1822)\n- Fix sample workflow from init_project_for_new_user\n [#2016](https://github.com/OpenFn/lightning/issues/2016)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped @openfn/ws-worker to 1.1.6\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Assure workflow is always passed to Run.enqueue\n [#2032](https://github.com/OpenFn/lightning/issues/2032)\n- Fix regression on History page where snapshots were not preloaded correctly\n [#2026](https://github.com/OpenFn/lightning/issues/2026)\n\n## [v2.4.2] - 2024-04-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix missing credential types when running Lightning using Docker\n [#2010](https://github.com/OpenFn/lightning/issues/2010)\n- Fix provisioning API includes deleted workflows in project state\n [#2001](https://github.com/OpenFn/lightning/issues/2001)\n\n## [v2.4.1] - 2024-04-19\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix github cli deploy action failing to auto-commit\n [#1995](https://github.com/OpenFn/lightning/issues/1995)\n\n## [v2.4.1-pre] - 2024-04-18\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add custom metric to track the number of finalised runs.\n [#1790](https://github.com/OpenFn/lightning/issues/1790)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Set better defaults for the GitHub connection creation screen\n [#1994](https://github.com/OpenFn/lightning/issues/1994)\n- Update `submission_status` for any Usagetracking.Report that does not have it\n set. [#1789](https://github.com/OpenFn/lightning/issues/1789)\n\n## [v2.4.0] - 2024-04-12\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow description below the page title\n [#1975](https://github.com/OpenFn/lightning/issues/1975)\n- Enable users to connect projects to their Github repos and branches that they\n have access to [#1895](https://github.com/OpenFn/lightning/issues/1895)\n- Enable users to connect multiple projects to a single Github repo\n [#1811](https://github.com/OpenFn/lightning/issues/1811)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Change all System.get_env calls in runtime.exs to use dotenvy\n [#1968](https://github.com/OpenFn/lightning/issues/1968)\n- Track usage tracking submission status in new field\n [#1789](https://github.com/OpenFn/lightning/issues/1789)\n- Send richer version info as part of usage tracking submission.\n [#1819](https://github.com/OpenFn/lightning/issues/1819)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix sync to branch only targetting main branch\n [#1892](https://github.com/OpenFn/lightning/issues/1892)\n- Fix enqueue run without the workflow info\n [#1981](https://github.com/OpenFn/lightning/issues/1981)\n\n## [v2.3.1] - 2024-04-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Run the usage tracking submission job more frequently to reduce the risk of\n Oban unavailability at a particular time.\n [#1778](https://github.com/OpenFn/lightning/issues/1778)\n- Remove code supporting V1 usage tracking submissions.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix scrolling behaviour on inspector for small screens\n [#1962](https://github.com/OpenFn/lightning/issues/1962)\n- Fix project picker for users with many projects\n [#1952](https://github.com/OpenFn/lightning/issues/1952)\n\n## [v2.3.0] - 2024-04-02\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Support for additional paths on a webhook URL such as `/i/ /Patient`\n [#1954](https://github.com/OpenFn/lightning/issues/1954)\n- Support for a GET endpoint to \"check\" webhook URL availability\n [#1063](https://github.com/OpenFn/lightning/issues/1063)\n- Allow external apps to control the run enqueue db transaction\n [#1958](https://github.com/OpenFn/lightning/issues/1958)\n\n## [v2.2.2] - 2024-04-01\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Changed dataclip search from string `LIKE` to tsvector on keys and values.\n While this will limit partial string matching to the beginning of words (not\n the middle or end) it will make searching way more performant\n [#1939](https://github.com/OpenFn/lightning/issues/1939)\n- Translate job error messages using errors.po file\n [#1935](https://github.com/OpenFn/lightning/issues/1935)\n- Improve the UI/UX of the run panel on the inspector for small screens\n [#1909](https://github.com/OpenFn/lightning/issues/1909)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Regular database timeouts when searching across dataclip bodies\n [#1794](https://github.com/OpenFn/lightning/issues/1794)\n\n## [v2.2.1] - 2024-03-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Enable users to connect to their Github accounts in preparation for\n streamlined GitHub project sync setup\n [#1894](https://github.com/OpenFn/lightning/issues/1894)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Apply usage limit to bulk-reruns\n [#1931](https://github.com/OpenFn/lightning/issues/1931)\n- Fix edge case that could result in duplicate usage tracking submissions.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n- Fix query timeout issue on history retention deletion\n [#1937](https://github.com/OpenFn/lightning/issues/1937)\n\n## [v2.2.0] - 2024-03-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow admins to set project retention periods\n [#1760](https://github.com/OpenFn/lightning/issues/1760)\n- Automatically wipe input/output data after their retention period\n [#1762](https://github.com/OpenFn/lightning/issues/1762)\n- Automatically delete work order history after their retention period\n [#1761](https://github.com/OpenFn/lightning/issues/1761)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- When automatically creating a project for a newly registered user (via the\n `INIT_PROJECT_FOR_NEW_USER=true` environment variable) that user should be the\n `owner` of the project.\n [#1927](https://github.com/OpenFn/lightning/issues/1927)\n- Give priority to manual runs (over webhook requests and cron) so that active\n users on the inspector don't have to wait ages for thier work during high load\n periods [#1918](https://github.com/OpenFn/lightning/issues/1918)\n\n## [v2.1.0] - 2024-03-20\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- TSVector index to log_lines, and gin index to dataclips\n [#1898](https://github.com/OpenFn/lightning/issues/1898)\n- Add API Version field to Salesforce OAuth credentials\n [#1838](https://github.com/OpenFn/lightning/issues/1838)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Replace v1 usage tracking with v2 usage tracking.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n## [v2.0.10]\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Updated anonymous usage tracker submissions\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n## [v2.0.9] - 2024-03-19\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Support for smaller screens on history and inspector.\n [#1908](https://github.com/OpenFn/lightning/issues/1908)\n- Polling metric to track number of available runs.\n [#1790](https://github.com/OpenFn/lightning/issues/1790)\n- Allows limiting creation of new runs and retries.\n [#1754](https://github.com/OpenFn/Lightning/issues/1754)\n- Add specific messages for log, input, and output tabs when a run is lost\n [#1757](https://github.com/OpenFn/lightning/issues/1757)\n- Soft and hard limits for runs created by webhook trigger.\n [#1859](https://github.com/OpenFn/Lightning/issues/1859)\n- Publish an event when a new user is registered\n [#1873](https://github.com/OpenFn/lightning/issues/1873)\n- Adds ability to add project collaborators from existing users\n [#1836](https://github.com/OpenFn/lightning/issues/1836)\n- Added ability to remove project collaborators\n [#1837](https://github.com/OpenFn/lightning/issues/1837)\n- Added new usage tracking submission code.\n [#1853](https://github.com/OpenFn/lightning/issues/1853)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Upgrade Elixir to 1.16.2\n- Remove all values from `.env.example`.\n [#1904](https://github.com/OpenFn/lightning/issues/1904)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Verify only stale project credentials\n [#1861](https://github.com/OpenFn/lightning/issues/1861)\n\n## [v2.0.8] - 2024-02-29\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Show flash error when editing stale project credentials\n [#1795](https://github.com/OpenFn/lightning/issues/1795)\n- Fixed bug with Github sync installation on docker-based deployments\n [#1845](https://github.com/OpenFn/lightning/issues/1845)\n\n## [v2.0.6] - 2024-02-29\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Automatically create Github workflows in a target repository/branch when users\n set up a Github repo::OpenFn project sync\n [#1046](https://github.com/OpenFn/lightning/issues/1046)\n- Allows limiting creation of new runs and retries.\n [#1754](https://github.com/OpenFn/Lightning/issues/1754)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Change bucket size used by the run queue delay custom metric.\n [#1790](https://github.com/OpenFn/lightning/issues/1790)\n- Require setting `IS_RESETTABLE_DEMO` to \"yes\" via ENV before allowing the\n destructive `Demo.reset_demo/0` function from being called.\n [#1720](https://github.com/OpenFn/lightning/issues/1720)\n- Remove version display condition that was redundant due to shadowing\n [#1819](https://github.com/OpenFn/lightning/issues/1819)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix series of sentry issues related to OAuth credentials\n [#1799](https://github.com/OpenFn/lightning/issues/1799)\n\n## [v2.0.5] - 2024-02-25\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed error in Credentials without `sanbox` field set; only display `sandbox`\n field for Salesforce oauth credentials.\n [#1798](https://github.com/OpenFn/lightning/issues/1798)\n\n## [v2.0.4] - 2024-02-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Display and edit OAuth credentials\n scopes[#1706](https://github.com/OpenFn/Lightning/issues/1706)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Stop sending `operating_system_detail` to the usage tracker\n [#1785](https://github.com/OpenFn/lightning/issues/1785)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Make handling of usage tracking errors more robust.\n [#1787](https://github.com/OpenFn/lightning/issues/1787)\n- Fix inspector shows selected dataclip as wiped after retying workorder from a\n non-first step [#1780](https://github.com/OpenFn/lightning/issues/1780)\n\n## [v2.0.3] - 2024-02-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Actual metrics will now be submitted by Lightning to the Usage Tracker.\n [#1742](https://github.com/OpenFn/lightning/issues/1742)\n- Added a support link to the menu that goes to the instance admin contact\n [#1783](https://github.com/OpenFn/lightning/issues/1783)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Usage Tracking submissions are now opt-out, rather than opt-in. Hashed UUIDs\n to ensure anonymity are default.\n [#1742](https://github.com/OpenFn/lightning/issues/1742)\n- Usage Tracking submissions will now run daily rather than hourly.\n [#1742](https://github.com/OpenFn/lightning/issues/1742)\n\n- Bumped @openfn/ws-worker to `v1.0` (this is used in dev mode when starting the\n worker from your mix app: `RTM=true iex -S mix phx.server`)\n- Bumped @openfn/cli to `v1.0` (this is used for adaptor docs and magic)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Non-responsive workflow canvas after web socket disconnection\n [#1750](https://github.com/OpenFn/lightning/issues/1750)\n\n## [v2.0.2] - 2024-02-14\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed a bug with the OAuth2 credential refresh flow that prevented\n GoogleSheets jobs from running after token expiration\n [#1735](https://github.com/OpenFn/Lightning/issues/1735)\n\n## [v2.0.1] - 2024-02-13\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Renamed ImpactTracking to UsageTracking\n [#1729](https://github.com/OpenFn/lightning/issues/1729)\n- Block github installation if there's a pending installation in another project\n [#1731](https://github.com/OpenFn/Lightning/issues/1731)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Expand work order button balloons randomly\n [#1737](https://github.com/OpenFn/Lightning/issues/1737)\n- Editing credentials doesn't work from project scope\n [#1743](https://github.com/OpenFn/Lightning/issues/1743)\n\n## [v2.0.0] - 2024-02-10\n\n> At the time of writing there are no more big changes planned and testing has\n> gone well. Thanks to everyone who's helped to kick the tyres during the \"rc\"\n> phase. There are still a _lot of **new features** coming_, so please:\n>\n> - watch our [**Public Roadmap**](https://github.com/orgs/OpenFn/projects/3) to\n> stay abreast of our core team's backlog,\n> - request a feature in the\n> [**Community Forum**](https://community.openfn.org),\n> - raise a\n> [**new issue**](https://github.com/OpenFn/lightning/issues/new/choose) if\n> you spot a bug,\n> - and head over to the\n> [**Contributing**](https://github.com/OpenFn/lightning/?tab=readme-ov-file#contribute-to-this-project)\n> section to lend a hand.\n>\n> Head to [**docs.openfn.org**](https://docs.openfn.org) for product\n> documentation and help with v1 to v2 migration.\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bump `@openfn/worker` to `v0.8.1`\n- Only show GoogleSheets and Salesforce credential options if Oauth clients are\n registered with the instance via ENV\n [#1734](https://github.com/OpenFn/Lightning/issues/1734)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Use standard table type for webhook auth methods\n [#1514](https://github.com/OpenFn/Lightning/issues/1514)\n- Make disabled button for \"Connect to GitHub\" clear, add tooltip\n [#1732](https://github.com/OpenFn/Lightning/issues/1715)\n\n## [v2.0.0-rc12] - 2024-02-09\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add RunQueue extension to allow claim customization.\n [#1715](https://github.com/OpenFn/Lightning/issues/1715)\n- Add support for Salesforce OAuth2 credentials\n [#1633](https://github.com/OpenFn/Lightning/issues/1633)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Use `PAYLOAD_SIZE_KB` in k6 load testing script, set thresholds on wait time,\n set default payload size to `2kb`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Adds more detail to work order states on dashboard\n [#1677](https://github.com/OpenFn/lightning/issues/1677)\n- Fix Output & Logs in inspector fails to show sometimes\n [#1702](https://github.com/OpenFn/lightning/issues/1702)\n\n## [v2.0.0-rc11] - 2024-02-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Bumped Phoenix LiveView from `0.20.4` to `0.20.5` to fix canvas selection\n issue [#1724](https://github.com/OpenFn/lightning/issues/1724)\n\n## [v2.0.0-rc10] - 2024-02-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Implemented safeguards to prevent deletion of jobs with associated run history\n [#1570](https://github.com/OpenFn/Lightning/issues/1570)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed inspector dataclip body not getting updated after dataclip is wiped\n [#1718](https://github.com/OpenFn/Lightning/issues/1718)\n- Fixed work orders getting retried despite having wiped dataclips\n [#1721](https://github.com/OpenFn/Lightning/issues/1721)\n\n## [v2.0.0-rc9] 2024-02-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Persist impact tracking configuration and reports\n [#1684](https://github.com/OpenFn/Lightning/issues/1684)\n- Add zero-persistence project setting\n [#1209](https://github.com/OpenFn/Lightning/issues/1209)\n- Wipe dataclip after use when zero-persistence is enabled\n [#1212](https://github.com/OpenFn/Lightning/issues/1212)\n- Show appropriate message when a wiped dataclip is viewed\n [#1211](https://github.com/OpenFn/Lightning/issues/1211)\n- Disable selecting work orders having wiped dataclips in the history page\n [#1210](https://github.com/OpenFn/Lightning/issues/1210)\n- Hide rerun button in inspector when the selected step has a wiped dataclip\n [#1639](https://github.com/OpenFn/Lightning/issues/1639)\n- Add rate limiter to webhook endpoints and runtime limiter for runs.\n [#639](https://github.com/OpenFn/Lightning/issues/639)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Prevented secret scrubber from over-eagerly adding \\*\\*\\* between all\n characters if an empty string secret was provided as a credential field value\n (e.g., {\"username\": \"come-on-in\", \"password\": \"\"})\n [#1585](https://github.com/OpenFn/Lightning/issues/1585)\n- Fixed permissions issue that allowed viewer/editor to modify webhook auth\n methods. These permissions only belong to project owners and admins\n [#1692](https://github.com/OpenFn/Lightning/issues/1692)\n- Fixed bug that was duplicating inbound http_requests, resulting in unnecessary\n data storage [#1695](https://github.com/OpenFn/Lightning/issues/1695)\n- Fixed permissions issue that allowed editors to set up new Github connections\n [#1703](https://github.com/OpenFn/Lightning/issues/1703)\n- Fixed permissions issue that allowed viewers to initiate syncs to github\n [#1704](https://github.com/OpenFn/Lightning/issues/1704)\n- Fixed inspector view stuck at processing when following a crashed run\n [#1711](https://github.com/OpenFn/Lightning/issues/1711)\n- Fixed inspector dataclip selector not getting updated after running manual run\n [#1714](https://github.com/OpenFn/Lightning/issues/1714)\n\n## [v2.0.0-rc8] - 2024-01-30\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Shim code to interact with the Impact Tracking service\n [#1671](https://github.com/OpenFn/Lightning/issues/1671)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Standardized naming of \"attempts\" to \"runs\". This had already been done in the\n front-end, but this change cleans up the backend, the database, and the\n interface with the worker. Make sure to **run migrations** and update your\n ENV/secrets to use `WORKER_RUNS_PRIVATE_KEY` rather than\n `WORKER_ATTEMPTS_PRIVATE_KEY`\n [#1657](https://github.com/OpenFn/Lightning/issues/1657)\n- Required `@openfn/ws-worker@0.8.0` or above.\n\n## [v2.0.0-rc7] - 2024-01-26\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Store webhook request headers in Dataclips for use in jobs.\n [#1638](https://github.com/OpenFn/Lightning/issues/1638)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Display `http_request` dataclips to the user as they will be provided to the\n worker as \"input\" state to avoid confusion while writing jobs.\n [1664](https://github.com/OpenFn/Lightning/issues/1664)\n- Named-spaced all worker environment variables with `WORKER_` and added\n documentation for how to configure them.\n [#1672](https://github.com/OpenFn/Lightning/pull/1672)\n- Bumped to `@openfn/ws-worker@0.6.0`\n- Bumped to `@openfn/cli@0.4.15`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix Run via Docker [#1653](https://github.com/OpenFn/Lightning/issues/1653)\n- Fix remaining warnings, enable \"warnings as errors\"\n [#1642](https://github.com/OpenFn/Lightning/issues/1642)\n- Fix workflow dashboard bug when viewed for newly created workflows with only\n unfinished run steps. [#1674](https://github.com/OpenFn/Lightning/issues/1674)\n\n## [v2.0.0-rc5] - 2024-01-22\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Made two significant backend changes that don't impact UI/UX but **require\n migrations** and should make Lightning developer lives easier by updating\n parts of the backend to match terms now used in the frontend:\n - Renamed the `Runs` model and table to `Steps`\n [#1571](https://github.com/OpenFn/Lightning/issues/1571)\n - Renamed the `AttemptRuns` model and table to `AttemptSteps`\n [#1571](https://github.com/OpenFn/Lightning/issues/1571)\n\n## [v2.0.0-rc4] - 2024-01-19\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Scrub output dataclips in the UI to avoid unintentional secret exposure\n [#1606](https://github.com/OpenFn/Lightning/issues/1606)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bump to `@openfn/cli@0.4.14`\n- Do not persist the active tab setting on the job editor\n [#1504](https://github.com/OpenFn/Lightning/issues/1504)\n- Make condition label optional\n [#1648](https://github.com/OpenFn/Lightning/issues/1648)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix credential body getting leaked to sentry incase of errors\n [#1600](https://github.com/OpenFn/Lightning/issues/1600)\n- Fixed validation on Javascript edge conditions\n [#1602](https://github.com/OpenFn/Lightning/issues/1602)\n- Removed unused code from `run_live` directory\n [#1625](https://github.com/OpenFn/Lightning/issues/1625)\n- Edge condition expressions not correctly being handled during provisioning\n [#openfn/kit#560](https://github.com/OpenFn/kit/pull/560)\n\n## [v2.0.0-rc3] 2024-01-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Custom metric to track stalled attempts\n [#1559](https://github.com/OpenFn/Lightning/issues/1559)\n- Dashboard with project and workflow stats\n [#755](https://github.com/OpenFn/Lightning/issues/755)\n- Add search by ID on the history page\n [#1468](https://github.com/OpenFn/Lightning/issues/1468)\n- Custom metric to support autoscaling\n [#1607](https://github.com/OpenFn/Lightning/issues/1607)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped CLI version to `0.4.13`\n- Bumped worker version to `0.5.0`\n- Give project editors and viewers read only access to project settings instead\n [#1477](https://github.com/OpenFn/Lightning/issues/1477)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Throw an error when Lightning.MetadataService.get_adaptor_path/1 returns an\n adaptor path that is nil\n [#1601](https://github.com/OpenFn/Lightning/issues/1601)\n- Fix failure due to creating work order from a newly created job\n [#1572](https://github.com/OpenFn/Lightning/issues/1572)\n- Fixes on the dashboard and links\n [#1610](https://github.com/OpenFn/Lightning/issues/1610) and\n [#1608](https://github.com/OpenFn/Lightning/issues/1608)\n\n## [2.0.0-rc2] - 2024-01-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Restored left-alignment for step list items on run detail and inspector\n [a6e4ada](https://github.com/OpenFn/Lightning/commit/a6e4adafd558269cfd690e7c4fdd8f9fe66c5f62)\n- Inspector: fixed attempt/run language for \"skipped\" tooltip\n [fd7dd0c](https://github.com/OpenFn/Lightning/commit/fd7dd0ca8128dfba2902e5aa6a2259e2073f0f10)\n- Inspector: fixed failure to save during \"save & run\" from inspector\n [#1596](https://github.com/OpenFn/Lightning/issues/1596)\n- Inspector: fixed key bindings for save & run (retry vs. new work order)\n getting overridden when user focuses on the Monaco editor\n [#1596](https://github.com/OpenFn/Lightning/issues/1596)\n\n## [2.0.0-rc1] - 2024-01-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Why does this repo go from `v0` to `v2.0`? - Changelog","doc":"Lightning is the _2nd version_ of the OpenFn platform. While much of the core\ntechnology is the same, there are breaking changes between `v1.105` (pre-2024)\nand `v2` (\"OpenFn Lightning\").\n\nFor customers using OpenFn `v1`, a migration guide will be provided at\n[docs.openfn.org](https://docs.openfn.org)\n\n#","ref":"changelog.html#why-does-this-repo-go-from-v0-to-v2-0"},{"type":"extras","title":"Added - Changelog","doc":"- Link to the job inspctor for a selected run from the history interface\n [#1524](https://github.com/OpenFn/Lightning/issues/1524)\n- Reprocess an existing work order from the job inspector by default (instead of\n always creating a new work order)\n [#1524](https://github.com/OpenFn/Lightning/issues/1524)\n- Bumped worker to support edge conditions between trigger and first job\n `\"@openfn/ws-worker\": \"^0.4.0\"`\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Updated naming to prepare for v2 release\n [#1248](https://github.com/OpenFn/Lightning/issues/1248); the major change is\n that each time a work order (the typical unit of business value for an\n organization, e.g. \"execute workflow ABC for patient 123\") is executed, it is\n called a \"run\". Previously, it was called an \"attempt\". The hierarchy is now:\n\n ```\n Build-Time: Projects > Workflows > Steps\n Run-Time: Work Orders > Runs > Steps\n ```\n\n Note the name changes here are reflected in the UI, but not all tables/models\n will be changed until [1571](https://github.com/OpenFn/Lightning/issues/1571)\n is delivered.\n\n## [v0.12.2] - 2023-12-24\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Bumped worker to address occasional git install issue\n `\"@openfn/ws-worker\": \"^0.3.2\"`\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix RuntimeError: found duplicate ID \"google-sheets-inner-form\" for\n GoogleSheetsComponent [#1578](https://github.com/OpenFn/Lightning/issues/1578)\n- Extend export script to include new JS expression edge type\n [#1540](https://github.com/OpenFn/Lightning/issues/1540)\n- Fix regression for attempt viewer log line highlighting\n [#1589](https://github.com/OpenFn/Lightning/issues/1589)\n\n## [v0.12.1] - 2023-12-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Hide project security setting tab from non-authorized users\n [#1477](https://github.com/OpenFn/Lightning/issues/1477)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- History page crashes if job is removed from workflow after it's been run\n [#1568](https://github.com/OpenFn/Lightning/issues/1568)\n\n## [v0.12.0] - 2023-12-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add ellipsis for long job names on the canvas\n [#1217](https://github.com/OpenFn/Lightning/issues/1217)\n- Fix Credential Creation Page UI\n [#1064](https://github.com/OpenFn/Lightning/issues/1064)\n- Custom metric to track Attempt queue delay\n [#1556](https://github.com/OpenFn/Lightning/issues/1556)\n- Expand work order row when a `workorder_id` is specified in the filter\n [#1515](https://github.com/OpenFn/Lightning/issues/1515)\n- Allow Javascript expressions as conditions for edges\n [#1498](https://github.com/OpenFn/Lightning/issues/1498)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Derive dataclip in inspector from the attempt & step\n [#1551](https://github.com/OpenFn/Lightning/issues/1551)\n- Updated CLI to 0.4.10 (fixes logging)\n- Changed UserBackupToken model to use UTC timestamps (6563cb77)\n- Restore FK relationship between `work_orders` and `attempts` pending a\n decision re: further partitioning.\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- New credential doesn't appear in inspector until refresh\n [#1531](https://github.com/OpenFn/Lightning/issues/1531)\n- Metadata not refreshing when credential is updated\n [#791](https://github.com/OpenFn/Lightning/issues/791)\n- Adjusted z-index for Monaco Editor's sibling element to resolve layout\n conflict [#1329](https://github.com/OpenFn/Lightning/issues/1329)\n- Demo script sets up example Runs with their log lines in a consistant order.\n [#1487](https://github.com/OpenFn/Lightning/issues/1487)\n- Initial credential creation `changes` show `after` as `null` rather a value\n [#1118](https://github.com/OpenFn/Lightning/issues/1118)\n- AttemptViewer flashing/rerendering when Jobs are running\n [#1550](https://github.com/OpenFn/Lightning/issues/1550)\n- Not able to create a new Job when clicking the Check icon on the placeholder\n [#1537](https://github.com/OpenFn/Lightning/issues/1537)\n- Improve selection logic on WorkflowDiagram\n [#1220](https://github.com/OpenFn/Lightning/issues/1220)\n\n## [v0.11.0] - 2023-12-06\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Improved UI when manually creating Attempts via the Job Editor\n [#1474](https://github.com/OpenFn/Lightning/issues/1474)\n- Increased the maximum inbound webhook request size to 10MB and added\n protection against _very large_ payloads with a 100MB \"max_skip_body_length\"\n [#1247](https://github.com/OpenFn/Lightning/issues/1247)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Use the internal port of the web container for the worker configuration in\n docker-compose setup. [#1485](https://github.com/OpenFn/Lightning/pull/1485)\n\n## [v0.10.6] - 2023-12-05\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Limit entries count on term work orders search\n [#1461](https://github.com/OpenFn/Lightning/issues/1461)\n- Scrub log lines using multiple credentials samples\n [#1519](https://github.com/OpenFn/Lightning/issues/1519)\n- Remove custom telemetry plumbing.\n [1259](https://github.com/OpenFn/Lightning/issues/1259)\n- Enhance UX to prevent modal closure when Monaco/Dataclip editor is focused\n [#1510](https://github.com/OpenFn/Lightning/pull/1510)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Use checkbox on boolean credential fields rather than a text input field\n [#1430](https://github.com/OpenFn/Lightning/issues/1430)\n- Allow users to retry work orders that failed before their first run was\n created [#1417](https://github.com/OpenFn/Lightning/issues/1417)\n- Fix to ensure webhook auth modal is closed when cancel or close are selected.\n [#1508](https://github.com/OpenFn/Lightning/issues/1508)\n- Enable user to reauthorize and obtain a new refresh token.\n [#1495](https://github.com/OpenFn/Lightning/issues/1495)\n- Save credential body with types declared on schema\n [#1518](https://github.com/OpenFn/Lightning/issues/1518)\n\n## [v0.10.5] - 2023-12-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Only add history page filters when needed for simpler multi-select status\n interface and shorter page URLs\n [#1331](https://github.com/OpenFn/Lightning/issues/1331)\n- Use dynamic Endpoint config only on prod\n [#1435](https://github.com/OpenFn/Lightning/issues/1435)\n- Validate schema field with any of expected values\n [#1502](https://github.com/OpenFn/Lightning/issues/1502)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix for liveview crash when token expires or gets deleted after mount\n [#1318](https://github.com/OpenFn/Lightning/issues/1318)\n- Remove two obsolete methods related to Run: `Lightning.Invocation.delete_run`\n and `Lightning.Invocation.Run.new_from`.\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Remove obsolete field `previous_id` from `runs` table.\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Fix for missing data in 'created' audit trail events for webhook auth methods\n [#1500](https://github.com/OpenFn/Lightning/issues/1500)\n\n## [v0.10.4] - 2023-11-30\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Increased History search timeout to 30s\n [#1461](https://github.com/OpenFn/Lightning/issues/1461)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Tooltip text clears later than the background\n [#1094](https://github.com/OpenFn/Lightning/issues/1094)\n- Temporary fix to superuser UI for managing project users\n [#1145](https://github.com/OpenFn/Lightning/issues/1145)\n- Fix for adding ellipses on credential info on job editor heading\n [#1428](https://github.com/OpenFn/Lightning/issues/1428)\n\n## [v0.10.3] - 2023-11-28\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Dimmed/greyed out triggers and edges on the canvas when they are disabled\n [#1464](https://github.com/OpenFn/Lightning/issues/1464)\n- Async loading on the history page to improve UX on long DB queries\n [#1279](https://github.com/OpenFn/Lightning/issues/1279)\n- Audit trail events for webhook auth (deletion method) change\n [#1165](https://github.com/OpenFn/Lightning/issues/1165)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Sort project collaborators by first name\n [#1326](https://github.com/OpenFn/Lightning/issues/1326)\n- Work orders will now be set in a \"pending\" state when retries are enqueued.\n [#1340](https://github.com/OpenFn/Lightning/issues/1340)\n- Avoid printing 2FA codes by default\n [#1322](https://github.com/OpenFn/Lightning/issues/1322)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Create new workflow button sizing regression\n [#1405](https://github.com/OpenFn/Lightning/issues/1405)\n- Google credential creation and automatic closing of oAuth tab\n [#1109](https://github.com/OpenFn/Lightning/issues/1109)\n- Exporting project breaks the navigation of the page\n [#1440](https://github.com/OpenFn/Lightning/issues/1440)\n\n## [v0.10.2] - 2023-11-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Added `max_frame_size` to the Cowboy websockets protocol options in an attempt\n to address [#1421](https://github.com/OpenFn/Lightning/issues/1421)\n\n## [v0.10.1] - 2023-11-21\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Work Order ID was not displayed properly in history page\n [#1423](https://github.com/OpenFn/Lightning/issues/1423)\n\n## [v0.10.0] - 2023-11-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"🚨 Breaking change warning! 🚨 - Changelog","doc":"This release will contain breaking changes as we've significantly improved both\nthe workflow building and execution systems.\n\n##","ref":"changelog.html#breaking-change-warning"},{"type":"extras","title":"Nodes and edges - Changelog","doc":"Before, workflows were represented as a list of jobs and triggers. For greater\nflexibility and control of complex workflows, we've moved towards a more robust\n\"nodes and edges\" approach. Where jobs in a workflow (a node) can be connected\nby edges.\n\nTriggers still exist, but live \"outside\" the directed acyclic graph (DAG) and\nare used to automatically create work orders and attempts.\n\nWe've provided migrations that bring `v0.9.3` workflows in line with the\n`v0.10.0` requirements.\n\n##","ref":"changelog.html#nodes-and-edges"},{"type":"extras","title":"Scalable workers - Changelog","doc":"Before, Lightning spawned child processes to execute attempts in sand-boxed\nNodeVMs on the same server. This created inefficiencies and security\nvulnerabilities. Now, the Lightning web server adds attempts to a queue and\nmultiple worker applications can pull from that queue to process work.\n\nIn dev mode, this all happens automatically and on one machine, but in most\nhigh-availability production environments the workers will be on another server.\n\nAttempts are now handled entirely by the workers, and they report back to\nLightning. Exit reasons, final attempt states, error types and error messages\nare either entirely new or handled differently now, but we have provided\nmigration scripts that will work to bring _most_ `v0.9.3` runs, attempts, and\nwork orders up to `v0.10.0`, though the granularity of `v0.9.3` states and exits\nwill be less than `v0.10.0` and the final states are not guaranteed to be\naccurate for workflows with multiple branches and leaf nodes with varying exit\nreasons.\n\nThe migration scripts can be run with a single function call in SetupUtils from\na connect `iex` session:\n\n```\nLightning.SetupUtils.approximate_state_for_attempts_and_workorders()\n```\n\nNote that (like lots of _other_ functionality in `SetupUtils`, calling this\nfunction is a destructive action and you should only do it if you've backed up\nyour data and you know what you're doing.)\n\nAs always, we recommend backing up your data before migrating. (And thanks for\nbearing with us as we move towards our first stable Lightning release.)\n\n#","ref":"changelog.html#scalable-workers"},{"type":"extras","title":"Added - Changelog","doc":"- Fix flaky job name input behavior on error\n [#1218](https://github.com/OpenFn/Lightning/issues/1218)\n- Added a hover effect on copy and add button for adaptors examples\n [#1297](https://github.com/OpenFn/Lightning/issues/1297)\n- Migration helper code to move from `v0.9.3` to `v0.10.0` added to SetupUtils\n [#1363](https://github.com/OpenFn/Lightning/issues/1363)\n- Option to start with `RTM=false iex -S mix phx.server` for opting out of the\n dev-mode automatic runtime manager.\n- Webhook Authentication Methods database and CRUD operations\n [#1152](https://github.com/OpenFn/Lightning/issues/1152)\n- Creation and Edit of webhook webhook authentication methods UI\n [#1149](https://github.com/OpenFn/Lightning/issues/1149)\n- Add webhook authentication methods overview methods in the canvas\n [#1153](https://github.com/OpenFn/Lightning/issues/1153)\n- Add icon on the canvas for triggers that have authentication enabled\n [#1157](https://github.com/OpenFn/Lightning/issues/1157)\n- Require password/2FA code before showing password and API Key for webhook auth\n methods [#1200](https://github.com/OpenFn/Lightning/issues/1200)\n- Restrict live dashboard access to only superusers, enable DB information and\n OS information [#1170](https://github.com/OpenFn/Lightning/issues/1170) OS\n information [#1170](https://github.com/OpenFn/Lightning/issues/1170)\n- Expose additional metrics to LiveDashboard\n [#1171](https://github.com/OpenFn/Lightning/issues/1171)\n- Add plumbing to dump Lightning metrics during load testing\n [#1178](https://github.com/OpenFn/Lightning/issues/1178)\n- Allow for heavier payloads during load testing\n [#1179](https://github.com/OpenFn/Lightning/issues/1179)\n- Add dynamic delay to help mitigate flickering test\n [#1195](https://github.com/OpenFn/Lightning/issues/1195)\n- Add a OpenTelemetry trace example\n [#1189](https://github.com/OpenFn/Lightning/issues/1189)\n- Add plumbing to support the use of PromEx\n [#1199](https://github.com/OpenFn/Lightning/issues/1199)\n- Add warning text to PromEx config\n [#1222](https://github.com/OpenFn/Lightning/issues/1222)\n- Track and filter on webhook controller state in :telemetry metrics\n [#1192](https://github.com/OpenFn/Lightning/issues/1192)\n- Secure PromEx metrics endpoint by default\n [#1223](https://github.com/OpenFn/Lightning/issues/1223)\n- Partition `log_lines` table based on `attempt_id`\n [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Remove foreign key from `attempts` in preparation for partitioning\n `work_orders` [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Remove `Workflows.delete_workflow`. It is no longer in use and would require\n modification to not leave orphaned attempts given the removal of the foreign\n key from `attempts`. [#1254](https://github.com/OpenFn/Lightning/issues/1254)\n- Show tooltip for cloned runs in history page\n [#1327](https://github.com/OpenFn/Lightning/issues/1327)\n- Have user create workflow name before moving to the canvas\n [#1103](https://github.com/OpenFn/Lightning/issues/1103)\n- Allow PromEx authorization to be disabled\n [#1483](https://github.com/OpenFn/Lightning/issues/1483)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Updated vulnerable JS libraries, `postcss` and `semver`\n [#1176](https://github.com/OpenFn/Lightning/issues/1176)\n- Update \"Delete\" to \"Delete Job\" on Job panel and include javascript deletion\n confirmation [#1105](https://github.com/OpenFn/Lightning/issues/1105)\n- Move \"Enabled\" property from \"Jobs\" to \"Edges\"\n [#895](https://github.com/OpenFn/Lightning/issues/895)\n- Incorrect wording on the \"Delete\" tooltip\n [#1313](https://github.com/OpenFn/Lightning/issues/1313)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed janitor lost query calculation\n [#1400](https://github.com/OpenFn/Lightning/issues/1400)\n- Adaptor icons load gracefully\n [#1140](https://github.com/OpenFn/Lightning/issues/1140)\n- Selected dataclip gets lost when starting a manual work order from the\n inspector interface [#1283](https://github.com/OpenFn/Lightning/issues/1283)\n- Ensure that the whole edge when selected is highlighted\n [#1160](https://github.com/OpenFn/Lightning/issues/1160)\n- Fix \"Reconfigure Github\" button in Project Settings\n [#1386](https://github.com/OpenFn/Lightning/issues/1386)\n- Make janitor also clean up runs inside an attempt\n [#1348](https://github.com/OpenFn/Lightning/issues/1348)\n- Modify CompleteRun to return error changeset when run not found\n [#1393](https://github.com/OpenFn/Lightning/issues/1393)\n- Drop invocation reasons from DB\n [#1412](https://github.com/OpenFn/Lightning/issues/1412)\n- Fix inconsistency in ordering of child nodes in the workflow diagram\n [#1406](https://github.com/OpenFn/Lightning/issues/1406)\n\n## [v0.9.3] - 2023-09-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add ellipsis when adaptor name is longer than the container allows\n [#1095](https://github.com/OpenFn/Lightning/issues/1095)\n- Webhook Authentication Methods database and CRUD operations\n [#1152](https://github.com/OpenFn/Lightning/issues/1152)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Prevent deletion of first job of a workflow\n [#1097](https://github.com/OpenFn/Lightning/issues/1097)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix long name on workflow cards\n [#1102](https://github.com/OpenFn/Lightning/issues/1102)\n- Fix highlighted Edge can get out of sync with selected Edge\n [#1099](https://github.com/OpenFn/Lightning/issues/1099)\n- Creating a new user without a password fails and there is no user feedback\n [#731](https://github.com/OpenFn/Lightning/issues/731)\n- Crash when setting up version control\n [#1112](https://github.com/OpenFn/Lightning/issues/1112)\n\n## [v0.9.2] - 2023-09-20\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add \"esc\" key binding to close job inspector modal\n [#1069](https://github.com/OpenFn/Lightning/issues/1069)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Save icons from the `adaptors` repo locally and load them in the job editor\n [#943](https://github.com/OpenFn/Lightning/issues/943)\n\n## [v0.9.1] - 2023-09-19\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Modified audit trail to handle lots of different kind of audit events\n [#271](https://github.com/OpenFn/Lightning/issues/271)/[#44](https://github.com/OpenFn/Lightning/issues/44)\n- Fix randomly unresponsive job panel after job deletion\n [#1113](https://github.com/OpenFn/Lightning/issues/1113)\n\n## [v0.9.0] - 2023-09-15\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Add favicons [#1079](https://github.com/OpenFn/Lightning/issues/1079)\n- Validate job name in placeholder job node\n [#1021](https://github.com/OpenFn/Lightning/issues/1021)\n- Bring credential delete in line with new GDPR interpretation\n [#802](https://github.com/OpenFn/Lightning/issues/802)\n- Make job names unique per workflow\n [#1053](https://github.com/OpenFn/Lightning/issues/1053)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Enhanced the job editor/inspector interface\n [#1025](https://github.com/OpenFn/Lightning/issues/1025)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Finished run never appears in inspector when it fails\n [#1084](https://github.com/OpenFn/Lightning/issues/1084)\n- Cannot delete some credentials via web UI\n [#1072](https://github.com/OpenFn/Lightning/issues/1072)\n- Stopped the History table from jumping when re-running a job\n [#1100](https://github.com/OpenFn/Lightning/issues/1100)\n- Fixed the \"+\" button when adding a job to a workflow\n [#1093](https://github.com/OpenFn/Lightning/issues/1093)\n\n## [v0.8.3] - 2023-09-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Render error when workflow diagram node is invalid\n [#956](https://github.com/OpenFn/Lightning/issues/956)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Restyle history table [#1029](https://github.com/OpenFn/Lightning/issues/1029)\n- Moved Filter and Search controls to the top of the history page\n [#1027](https://github.com/OpenFn/Lightning/issues/1027)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Output incorrectly shows \"this run failed\" when the run hasn't yet finished\n [#1048](https://github.com/OpenFn/Lightning/issues/1048)\n- Wrong label for workflow card timestamp\n [#1022](https://github.com/OpenFn/Lightning/issues/1022)\n\n## [v0.8.2] - 2023-08-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Lack of differentiation between top of job editor modal and top menu was\n disorienting. Added shadow.\n\n## [v0.8.1] - 2023-08-31\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Moved Save and Run button to bottom of the Job edit modal\n [#1026](https://github.com/OpenFn/Lightning/issues/1026)\n- Allow a manual work order to save the workflow before creating the work order\n [#959](https://github.com/OpenFn/Lightning/issues/959)\n\n## [v0.8.0] - 2023-08-31\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Introduces Github sync feature, users can now setup our github app on their\n instance and sync projects using our latest portability spec\n [#970](https://github.com/OpenFn/Lightning/issues/970)\n- Support Backup Codes for Multi-Factor Authentication\n [937](https://github.com/OpenFn/Lightning/issues/937)\n- Log a warning in the console when the Editor/docs component is given latest\n [#958](https://github.com/OpenFn/Lightning/issues/958)\n- Improve feedback when a Workflow name is invalid\n [#961](https://github.com/OpenFn/Lightning/issues/961)\n- Show that the jobs' body is invalid\n [#957](https://github.com/OpenFn/Lightning/issues/957)\n- Reimplement skipped CredentialLive tests\n [#962](https://github.com/OpenFn/Lightning/issues/962)\n- Reimplement skipped WorkflowLive.IndexTest test\n [#964](https://github.com/OpenFn/Lightning/issues/964)\n- Show GitHub installation ID and repo link to help setup/debugging for version\n control [1059](https://github.com/OpenFn/Lightning/issues/1059)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed issue where job names were being incorrectly hyphenated during\n project.yaml export [#1050](https://github.com/OpenFn/Lightning/issues/1050)\n- Allows the demo script to set a project id during creation to help with cli\n deploy/pull/Github integration testing.\n- Fixed demo project_repo_connection failing after nightly demo resets\n [1058](https://github.com/OpenFn/Lightning/issues/1058)\n- Fixed an issue where the monaco suggestion tooltip was offset from the main\n editor [1030](https://github.com/OpenFn/Lightning/issues/1030)\n\n## [v0.7.3] - 2023-08-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Version control in project settings is now named Export your project\n [#1015](https://github.com/OpenFn/Lightning/issues/1015)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Tooltip for credential select in Job Edit form is cut off\n [#972](https://github.com/OpenFn/Lightning/issues/972)\n- Dataclip type and state assembly notice for creating new dataclip dropped\n during refactor [#975](https://github.com/OpenFn/Lightning/issues/975)\n\n## [v0.7.2] - 2023-08-10\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- NodeJs security patch [1009](https://github.com/OpenFn/Lightning/pull/1009)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"## [v0.7.1] - 2023-08-04\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed flickery icons on new workflow job creation.\n\n## [v0.7.0] - 2023-08-04\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Project owners can require MFA for their users\n [892](https://github.com/OpenFn/Lightning/issues/892)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Moved to Elixir 1.15 and Erlang 26.0.2 to sort our an annoying ElixirLS issue\n that was slowing down our engineers.\n- Update Debian base to use bookworm (Debian 12) for our Docker images\n- Change new credential modal to take up less space on the screen\n [#931](https://github.com/OpenFn/Lightning/issues/931)\n- Placeholder nodes are now purely handled client-side\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fix issue creating a new credential from the Job editor where the new\n credential was not being set on the job.\n [#951](https://github.com/OpenFn/Lightning/issues/951)\n- Fix issue where checking a credential type radio button shows as unchecked on\n first click. [#976](https://github.com/OpenFn/Lightning/issues/976)\n- Return the pre-filled workflow names\n [#971](https://github.com/OpenFn/Lightning/issues/971)\n- Fix version reporting and external reset_demo() call via\n Application.spec()[#1010](https://github.com/OpenFn/Lightning/issues/1010)\n- Fixed issue where entering a placeholder name through the form would result an\n in unsaveable workflow\n [#1001](https://github.com/OpenFn/Lightning/issues/1001)\n- Ensure the DownloadController checks for authentication and authorisation.\n\n## [v0.7.0-pre5] - 2023-07-28\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Changed - Changelog","doc":"- Unless otherwise specified, only show work orders with activity in last 14\n days [#968](https://github.com/OpenFn/Lightning/issues/968)\n\n## [v0.7.0-pre4] - 2023-07-27\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- Don't add cast fragments if the search_term is nil\n [#968](https://github.com/OpenFn/Lightning/issues/968)\n\n## [v0.7.0-pre3] - 2023-07-26\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed an issue with newly created edges that prevented downstream jobs\n [977](https://github.com/OpenFn/Lightning/issues/977)\n\n## [v0.7.0-pre2] - 2023-07-26\n\nNote that this is a pre-release with a couple of known bugs that are tracked in\nthe Nodes and Edges [epic](https://github.com/OpenFn/Lightning/issues/793).\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added ability for a user to enable MFA on their account; using 2FA apps like\n Authy, Google Authenticator etc\n [#890](https://github.com/OpenFn/Lightning/issues/890)\n- Write/run sql script to convert triggers\n [#875](https://github.com/OpenFn/Lightning/issues/875)\n- Export projects as `.yaml` via UI\n [#249](https://github.com/OpenFn/Lightning/issues/249)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- In `v0.7.0` we change the underlying workflow building and execution\n infrastructure to align with a standard \"nodes and edges\" design for directed\n acyclic graphs (DAGs). Make sure to run the migrations!\n [793](https://github.com/OpenFn/Lightning/issues/793)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Propagate url pushState/changes to Workflow Diagram selection\n [#944](https://github.com/OpenFn/Lightning/issues/944)\n- Fix issue when deleting nodes from the workflow editor\n [#830](https://github.com/OpenFn/Lightning/issues/830)\n- Fix issue when clicking a trigger on a new/unsaved workflow\n [#954](https://github.com/OpenFn/Lightning/issues/954)\n\n## [0.6.7] - 2023-07-13\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add feature to bulk rerun work orders from a specific step in their workflow;\n e.g., \"rerun these 50 work orders, starting each at step 4.\"\n [#906](https://github.com/OpenFn/Lightning/pull/906)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Oban exception: \"value too long\" when log lines are longer than 255 chars\n [#929](https://github.com/OpenFn/Lightning/issues/929)\n\n## [0.6.6] - 2023-06-30\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add public API token to the demo site setup script\n- Check and renew OAuth credentials when running a job\n [#646](https://github.com/OpenFn/Lightning/issues/646)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Remove google sheets from adaptors list until supporting oauth flow\n [#792](https://github.com/OpenFn/Lightning/issues/792)\n- Remove duplicate google sheets adaptor display on credential type picklist\n [#663](https://github.com/OpenFn/Lightning/issues/663)\n- Fix demo setup script for calling from outside the app on Kubernetes\n deployments [#917](https://github.com/OpenFn/Lightning/issues/917)\n\n## [0.6.5] - 2023-06-22\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Ability to rerun work orders from start by selecting one of more of them from\n the History page and clicking the \"Rerun\" button.\n [#659](https://github.com/OpenFn/Lightning/issues/659)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Example runs for demo incorrect\n [#856](https://github.com/OpenFn/Lightning/issues/856)\n\n## [0.6.3] - 2023-06-15\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Prevent saving null log lines to the database, fix issue with run display\n [#866](https://github.com/OpenFn/Lightning/issues/866)\n\n## [0.6.2] - 2023-06-09\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed viewer permissions for delete workflow\n\n- Fixed bug with workflow cards\n [#859](https://github.com/OpenFn/Lightning/issues/859)\n\n## [0.6.1] - 2023-06-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed bug with run logs [#864](https://github.com/OpenFn/Lightning/issues/864)\n\n- Correctly stagger demo runs to maintain order\n [#856](https://github.com/OpenFn/Lightning/issues/856)\n- Remove `Timex` use from `SetupUtils` in favor of `DateTime` to fix issue when\n calling it in escript.\n\n## [0.6.0]- 2023-04-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Create sample runs when generating sample workflow\n [#821](https://github.com/OpenFn/Lightning/issues/821)\n- Added a provisioning api for creating and updating projects and their\n workflows See: [PROVISIONING.md](./PROVISIONING.md)\n [#641](https://github.com/OpenFn/Lightning/issues/641)\n- Add ability for a `superuser` to schedule deletion, cancel deletion, and\n delete projects [#757](https://github.com/OpenFn/Lightning/issues/757)\n- Add ability for a `project owner` to schedule deletion, cancel deletion, and\n delete projects [#746](https://github.com/OpenFn/Lightning/issues/746)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Ability to store run log lines as rows in a separate table\n [#514](https://github.com/OpenFn/Lightning/issues/514)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Incorrect project digest queries\n [#768](https://github.com/OpenFn/Lightning/issues/768)]\n- Fix issue when purging deleted users\n [#747](https://github.com/OpenFn/Lightning/issues/747)\n- Generate a random name for Workflows when creating one via the UI.\n [#828](https://github.com/OpenFn/Lightning/issues/828)\n- Handle error when deleting a job with runs.\n [#814](https://github.com/OpenFn/Lightning/issues/814)\n\n## [0.5.2]\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add `workflow_edges` table in preparation for new workflow editor\n implementation [#794](https://github.com/OpenFn/Lightning/issues/794)\n- Stamped `credential_id` on run directly for easier auditing of the history\n interface. Admins can now see which credential was used to run a run.\n [#800](https://github.com/OpenFn/Lightning/issues/800)\n- Better errors when using magic functions: \"no magic yet\" and \"check\n credential\" [#812](https://github.com/OpenFn/Lightning/issues/812)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- The `delete-project` function now delete all associated activities\n [#759](https://github.com/OpenFn/Lightning/issues/759)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"## [0.5.1] - 2023-04-12\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added ability to create and revoke personal API tokens\n [#147](https://github.com/OpenFn/Lightning/issues/147)\n- Add `last-used at` to API tokens\n [#722](https://github.com/OpenFn/Lightning/issues/722)\n- Improved \"save\" for job builder; users can now press `Ctrl + S` or `⌘ + S` to\n save new or updated jobs job panel will _not_ close. (Click elsewhere in the\n canvas or click the \"Close\" button to close.)\n [#568](https://github.com/OpenFn/Lightning/issues/568)\n- Add filtered search params to the history page URL\n [#660](https://github.com/OpenFn/Lightning/issues/660)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- The secret scrubber now ignores booleans\n [690](https://github.com/OpenFn/Lightning/issues/690)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- The secret scrubber now properly handles integer secrets from credentials\n [690](https://github.com/OpenFn/Lightning/issues/690)\n- Updated describe-package dependency, fixing sparkles in adaptor-docs\n [657](https://github.com/OpenFn/Lightning/issues/657)\n- Clicks on the workflow canvas were not lining up with the nodes users clicked\n on; they are now [733](https://github.com/OpenFn/Lightning/issues/733)\n- Job panel behaves better when collapsed\n [774](https://github.com/OpenFn/Lightning/issues/774)\n\n## [0.5.0] - 2023-04-03\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Magic functions that fetch real metadata from connected systems via\n `credentials` and suggest completions in the job builder (e.g., pressing\n `control-space` when setting the `orgUnit` attribute for a DHIS2 create\n operation will pull the _actual_ list of orgUnits with human readable labels\n and fill in their orgUnit codes upon\n enter.)[670](https://github.com/OpenFn/Lightning/issues/670)\n- A \"metadata explorer\" to browse actual system metadata for connected\n instances. [658](https://github.com/OpenFn/Lightning/issues/658)\n- Resizable job builder panel for the main canvas/workflow view.\n [681](https://github.com/OpenFn/Lightning/issues/681)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Display timezone for cron schedule—it is always UTC.\n [#716](https://github.com/OpenFn/Lightning/issues/716)\n- Instance administrators can now configure the interval between when a project\n owner or user requests deletion and when these records are purged from the\n database. It defaults to 7, but by providing a `PURGE_DELETED_AFTER_DAYS`\n environment variable the grace period can be altered. Note that setting this\n variable to `0` will make automatic purging _never_ occur but will still make\n \"deleted\" projects and users unavailable. This has been requested by certain\n organizations that must retain audit logs in a Lightning instance.\n [758](https://github.com/OpenFn/Lightning/issues/758)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Locked CLI version to `@openfn/cli@0.0.35`.\n [#761](https://github.com/OpenFn/Lightning/issues/761)\n\n## [0.4.8] - 2023-03-29\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added a test harness for monitoring critical parts of the app using Telemetry\n [#654](https://github.com/OpenFn/Lightning/issues/654)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Set log level to `info` for runs. Most of the `debug` logging is useful for\n the CLI, but not for Lightning. In the future the log level will be\n configurable at instance > project > job level by the `superuser` and any\n project `admin`.\n- Renamed license file so that automagic github icon is less confusing\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Broken links in failure alert email\n [#732](https://github.com/OpenFn/Lightning/issues/732)\n- Registration Submission on app.openfn.org shows internal server error in\n browser [#686](https://github.com/OpenFn/Lightning/issues/686)\n- Run the correct runtime install mix task in `Dockerfile-dev`\n [#541](https://github.com/OpenFn/Lightning/issues/541)\n- Users not disabled when scheduled for deletion\n [#719](https://github.com/OpenFn/Lightning/issues/719)\n\n## [0.4.6] - 2023-03-23\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Implement roles and permissions across entire app\n [#645](https://github.com/OpenFn/Lightning/issues/645)\n- Fix webhook URL\n (`https:// >/i/cae544ab-03dc-4ccc-a09c-fb4edb255d7a`) for the\n OpenHIE demo workflow [448](https://github.com/OpenFn/Lightning/issues/448)\n- Phoenix Storybook for improved component development\n- Load test for webhook endpoint performance\n [#645](https://github.com/OpenFn/Lightning/issues/634)\n- Notify user via email when they're added to a project\n [#306](https://github.com/OpenFn/Lightning/issues/306)\n- Added notify user via email when their account is created\n [#307](https://github.com/OpenFn/Lightning/issues/307)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Improved errors when decoding encryption keys for use with Cloak.\n [#684](https://github.com/OpenFn/Lightning/issues/684)\n- Allow users to run ANY job with a custom input.\n [#629](https://github.com/OpenFn/Lightning/issues/629)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Ensure JSON schema form inputs are in the same order as they are written in\n the schema [#685](https://github.com/OpenFn/Lightning/issues/685)\n\n## [0.4.4] - 2023-03-10\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Users can receive a digest email reporting on a specified project.\n [#638](https://github.com/OpenFn/Lightning/issues/638)\n [#585](https://github.com/OpenFn/Lightning/issues/585)\n\n## [0.4.3] - 2023-03-06\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Added - Changelog","doc":"- Tooltips on Job Builder panel\n [#650](https://github.com/OpenFn/Lightning/issues/650)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Upgraded to Phoenix 1.7 (3945856)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Issue with FailureAlerter configuration missing in `prod` mode.\n\n## [0.4.2] - 2023-02-24\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- A user can change their own email\n [#247](https://github.com/OpenFn/Lightning/issues/247)\n- Added a `SCHEMAS_PATH` environment variable to override the default folder\n location for credential schemas\n [#604](https://github.com/OpenFn/Lightning/issues/604)\n- Added the ability to configure Google Sheets credentials\n [#536](https://github.com/OpenFn/Lightning/issues/536)\n- Function to import a project\n [#574](https://github.com/OpenFn/Lightning/issues/574)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Users cannot register if they have not selected the terms and conditions\n [#531](https://github.com/OpenFn/Lightning/issues/531)\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Jobs panel slow for first open after restart\n [#567](https://github.com/OpenFn/Lightning/issues/567)\n\n## [0.4.0] - 2023-02-08\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Added a Delete job button in Inspector\n- Filter workflow runs by text/value in run logs or input body\n- Drop \"configuration\" key from Run output dataclips after completion\n- Ability to 'rerun' a run from the Run list\n- Attempts and Runs update themselves in the Runs list\n- Configure a project and workflow for a new registering user\n- Run a job with a custom input\n- Added plausible analytics\n- Allow user to click on Webhook Trigger Node to copy webhook URL on workflow\n diagram\n- Allow any user to delete a credential that they own\n- Create any credential through a form except for OAuth\n- Refit all diagram nodes on browser and container resize\n- Enable distributed Erlang, allowing any number of redundant Lightning nodes to\n communicate with each other.\n- Users can set up realtime alerts for a project\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Better code-assist and intelliense in the Job Editor\n- Updated @openfn/workflow-diagram to 0.4.0\n- Make plus button part of job nodes in Workflow Diagram\n- Updated @openfn/adaptor-docs to 0.0.5\n- Updated @openfn/describe-package to 0.0.10\n- Create an follow a manual Run from the Job Inspector\n- View all workflows in a project on the workflows index page\n- Move @openfn/workflow-diagram into the application, the NPM module is now\n deprecated.\n- Remove workflow name from first node\n- Move the used parts of `@openfn/engine` into the application.\n- [BREAKING CHANGE] Ported `mix openfn.install.runtime` into application, use\n `mix lightning.install_runtime`.\n- [BREAKING CHANGE] Introduced `@openfn/cli` as the new runtime for Jobs\n- Rename a workflow through the page heading\n- Hide the dataclips tab for beta\n- Make adaptor default to common@latest\n- Remove jobs list page\n- Better error handling in the docs panel\n- Disable credential ownership transfer in dev and prod environments\n- Add project settings page\n- Change Work Order filters to apply to the aggregate state of the work order\n and not the run directly\n- Enable jobs by default\n- Set log level to info\n- Add Beta checkbox to register page\n- User roles and permissions\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Don't consider disabled jobs when calculating subsequent runs\n- Fixed overflow on Job Editor Tooltips\n- Fixed auto-scroll when adding a new snippet in the Job Editor\n- Fixed common operation typings in Job Editor\n\n## [0.3.1] - 2022-11-22\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed bug that tried to execute HTML scripts in dataclips\n- Fixed bug that prevented work orders from displaying in the order of their\n last run, descending.\n- Remove alerts after set timeout or close\n\n## [0.3.0] - 2022-11-21\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Add seed data for demo site\n- Create adaptor credentials through a form\n- Configure cron expressions through a form\n- View runs grouped by work orders and attempts\n- Run an existing Job with any dataclip uuid from the Job form\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Redirect users to projects list page when they click on Admin Settings menu\n- Move job, project, input and output Dataclips to Run table\n- Reverse the relationship between Jobs and Triggers. Triggers now can exist on\n their own; setting the stage for branching and merging workflows\n- Updated Elixir and frontend dependencies\n- [BREAKING CHANGE] Pipeline now uses Work Orders, previous data is not\n compatible.\n- Runs, Dataclips and Attempts now all correctly use `usec` resolution\n timestamps.\n- Upgraded LiveView to 0.18.0\n- Upgraded Elixir to 1.14.1 and OTP 25\n- Workflow Job editor now behaves like a panel\n- Split JobLive.InspectorFormComponent into different plug-able subcomponents\n- Ensure new jobs with cron triggers receive a default frequency\n- Webhooks are now referenced by the trigger id instead of job id.\n- Filter runs by status\n- Filter runs by workflow\n- Filter runs by date\n- View a job run from the runs history\n- View latest matching inputs to run a job with\n\n## [0.2.0] - 2022-09-12\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Changed - Changelog","doc":"- [BREAKING CHANGE] Add `Workflow` model, Jobs now belong to a Workflow This is\n a breaking change to the schema.\n- Use Node.js 18, soon to be in LTS.\n- Visualize success/fail triggers in workflow diagram.\n- Move WorkflowDiagram related actions from DashboardLive into WorkflowLive\n- Move WorkflowDiagram component into liveview, so that we can subscribe to\n channels (i.e. updating of the diagram when someone changes something).\n- Integrate `@openfn/workflow-diagram@0.0.8` and use the new Store interface for\n updating it.\n- Remove `component_mounted` event from WorkflowDiagram hook, using a\n MutationObserver and a Base64 encoded JSON payload.\n- Fixed an issue where the compiler component would try and load a 'nothing\n adaptor', added a condition to check an adaptor is actually selected.\n- Removed previous Workflow CTE queries, replaced by the introduction of the\n Workflow model, see\n (https://github.com/OpenFn/Lightning/blob/53da6883483e7d8d078783f348da327d1dd72d20/lib/lightning/workflows.ex#L111-L119).\n\n## [0.1.13] - 2022-08-29\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Allow administrators to configure OIDC providers for authentication (note that\n this is just for authenticating, not yet for creating new accounts via OIDC)\n- Add Monaco editor to the step/job panel\n- Allow users to delete their own accounts. Schedule their user and credentials\n data for deletion when they do.\n- Allow superusers to delete a user account. Schedule the user's credentials and\n user data for deletion when they do.\n- If a user is scheduled for deletion, disable their account and prevent them\n from logging in.\n- The 'User profile' and 'Credentials' page now have a sidebar menu\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Project users now have one of the following roles: viewer, editor, admin,\n owner\n- Users only have the following roles: user, superuser\n\n## [0.1.12] - 2022-08-15\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Added - Changelog","doc":"- Transfer credential ownership to another user.\n- Create credentials via a form interface\\*\n- Show \"projects with access\" in credentials list view.\n- Show job in runs list and run view.\n- Added roles and permissions to workflows and history page\n [#645](https://github.com/OpenFn/Lightning/issues/645)\n\n\\*The form is defined by a JSON schema provided by an adaptor, in most cases:\ne.g., `language-dhis2` provides a single schema which defines the required\nattributes for `state.configuration`, while `language-common` provides multiple\ncredential schemas like \"oauth\" or \"basic auth\" which define attributes for\n`state.configuration` and which might be used by lots of different jobs.)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- User menu (top right) appears on top of all other components.\n- User profile screen integrated with the rest of the liveview app.\n\n## [0.1.11] - 2022-08-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed logging in Runner when `:debug` log level used; note that this caused\n crashes in Oban\n\n## [0.1.10] - 2022-08-05\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Credential auditing\n- Build/version information display for easier debugging\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Fixed - Changelog","doc":"- Fixed a bug that enqueued cron-triggered jobs even when they were disabled\n\n## [0.1.9] - 2022-07-27\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Added - Changelog","doc":"- Navigate to user profile or credentials page and log out through the user icon\n dropdown\n- Create and edit dataclips\n- Add a production tag to credentials\n- View a dropdown of operations and their description for the language-common\n `v2.0.0-rc2` adaptor (this pattern to be rolled out across adaptors)\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Changed - Changelog","doc":"- Navigate between projects through a project picker on the navbar\n\n#","ref":"changelog.html#changed"},{"type":"extras","title":"Fixed - Changelog","doc":"- Run Lightning with docker\n\n#","ref":"changelog.html#fixed"},{"type":"extras","title":"Security - Changelog","doc":"- Sensitive credential values are scrubbed from run logs\n- All credentials are encrypted at REST\n\n## [0.1.7] - 2022-06-24\n\n#","ref":"changelog.html#security"},{"type":"extras","title":"Added - Changelog","doc":"- Run a job with a cron trigger\n- Queue jobs via Oban/Postgres\n- Edit jobs via the workflow canvas\n\n## [0.1.6] - 2022-06-07\n\n#","ref":"changelog.html#added"},{"type":"extras","title":"Added - Changelog","doc":"- Register, log in and log out of an account\n- Allow superusers and admin users to create projects\n- Allow admin users to create or disable a user’s account\n- Allow superusers for local deployments to create users and give them access to\n project spaces\n\n- Create and edit a job with a webhook, flow/fail or cron trigger\n- Create and edit credentials for a job\n- Copy a job's webhook URL\n- View all workflows in a project visually\n- Deploy lightning locally with Docker\n\n- Enable a job to automatically process incoming requests\n- Run a job with a webhook or flow/fail trigger\n- View job runs along with their logs, exit code, start and end time\n- View data clips that have initiated job runs (http requests for webhooks, run\n results)","ref":"changelog.html#added"}],"content_type":"text/markdown"}
\ No newline at end of file
diff --git a/readme.html b/readme.html
index b180c0bacc..b482069ed2 100644
--- a/readme.html
+++ b/readme.html
@@ -408,7 +408,7 @@
Problems with Debian
If you're getting this error on debian
==> earmark_parser
-Compiling 1 file (.yrl)
+Compiling 1 file (.yrl)
/usr/lib/erlang/lib/parsetools-2.3.1/include/yeccpre.hrl: no such file or directory
could not compile dependency :earmark_parser, "mix compile" failed. You can recompile this dependency with "mix deps.compile earmark_parser", update it with "mix deps.update earmark_parser" or clean it with "mix deps.clean earmark_parser"
You need to install erlang development environment sudo apt install erlang-dev
refer to this issue
@@ -431,12 +431,12 @@ Versions
The build may not work on old versions of Docker and Docker
docker compose run --rm web mix ecto.migrate
docker compose up
-
Apple Silicon
When running docker compose up
on Apple Silicon (M1, M2, M3), you might encounter the following error:
> [web 20/20] RUN npm install --prefix assets:
+
Apple Silicon
When running docker compose up
on Apple Silicon (M1, M2, M3), you might encounter the following error:
> [web 20/20] RUN npm install --prefix assets:
0.091 rosetta error: failed to open elf at /lib64/ld-linux-x86-64.so.2
0.091 Trace/breakpoint trap
------
failed to solve: process "/bin/sh -c npm install --prefix assets" did not complete successfully: exit code: 133
You can solve this by setting the default docker platform to linux/amd64
, i.e. DOCKER_DEFAULT_PLATFORM=linux/amd64
.
-You can read more on this here: https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direc
You might also run into:
[notice] Application ssl exited: exited in: :ssl_app.start(:normal, [])
+You can read more on this here: https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direcYou might also run into:
[notice] Application ssl exited: exited in: :ssl_app.start(:normal, [])
** (EXIT) an exception was raised:
** (ArgumentError) could not call Module.put_attribute/3 because the module Lightning.MixProject is already compiled
(elixir 1.16.2) lib/module.ex:2360: Module.assert_not_readonly!/2
@@ -460,8 +460,8 @@ Versions
The build may not work on old versions of Docker and Docker
lib/mix/tasks/compile.rambo.ex:89: Mix.Tasks.Compile.Rambo.compile!/0
lib/mix/tasks/compile.rambo.ex:51: Mix.Tasks.Compile.Rambo.run/1
- (mix 1.14.2) lib/mix/task.ex:421: anonymous fn/3 in Mix.Task.run_task/4
- (mix 1.14.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2
You can resolve this error by installing the Rust compiler using Homebrew. Run
+
(mix 1.14.2) lib/mix/task.ex:421: anonymous fn/3 in Mix.Task.run_task/4
+ (mix 1.14.2) lib/mix/cli.ex:84: Mix.CLI.run_task/2
You can resolve this error by installing the Rust compiler using Homebrew. Run
the following command in your terminal: brew install rust
If you have already compiled Rambo explicitly via mix compile.rambo
, and you
are still seeing the following error:
sh: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: No such file or directory
sh: line 0: exec: /path_to_directory/Lightning/_build/dev/lib/rambo/priv/rambo: cannot execute: No such file or directory
You can try renaming deps/rambo/priv/rambo-mac
to deps/rambo/priv/rambo
.
If neither of the approaches above work, please raise an issue.
diff --git a/search.html b/search.html
index 40b3b98f06..6e669ba729 100644
--- a/search.html
+++ b/search.html
@@ -130,7 +130,7 @@
-
+