Integrate.Stakeholders (IntegrateDB v0.1.0) View Source
The Stakeholders context.
Link to this section Summary
Functions
Returns an %Ecto.Changeset{} for tracking stakeholder changes.
Creates a stakeholder.
Deletes a stakeholder.
Gets a single stakeholder.
Gets a single stakeholder.
Initialize a stakeholder.
Returns the list of stakeholders.
Updates a stakeholder.
Link to this section Functions
Returns an %Ecto.Changeset{} for tracking stakeholder changes.
Examples
iex> change_stakeholder(stakeholder)
%Ecto.Changeset{data: %Stakeholder{}}
Creates a stakeholder.
This inserts a stakeholder, creates a corresponding DDL schema in the database and a corresponding database user, with dynamically generated credentials and access scoped to the new schema.
The stakeholder, schema and dbuser are all created with the same name -- and the
operation will error if this isn't possible. So creating a stakeholder with
%{"name" => "foo"} will create a foo.* db schema and a db user called foo
with a dynamically generated password.
Returns {:ok, %{stakeholder: %Stakeholder{}, db_user: {username, password}, ddl_schema: name}}
Examples
iex> create_stakeholder(user, %{name: "foo"})
{:ok, %{stakeholder: %Stakeholder{name: "foo"},
db_user: {"foo", 6ds67f5ds67ds5f7sf675hqx"}, ddl_schema: "foo"}
iex> create_stakeholder(user, %{name: nil})
{:error, :stakeholder, %Ecto.Changeset{}, _changes_so_far}
iex> create_stakeholder(user, %{name: "db-user-taken"})
{:error, :db_user, exception, _changes_so_far}
iex> create_stakeholder(user, %{name: "ddl-schema-taken"})
{:error, :ddl_schema, exception, _changes_so_far}
Deletes a stakeholder.
This deletes the stakeholder and the corresponding db user. It also tries to
delete the DDL schema, but using RESTRICT, so that it will only remove the
schema if it's empty.
It's easy for the drop user and drop schema to fail due to dependent objects.
As a result, we accept a ensure_all_dropped flag, defaulting to false.
When false, this tolerates a failure to drop caused by dependent objects and
indicates the failure to delete by including the db_user and / or ddl_schema
in the return value.
When true, we run everything in a transaction, which results in a rollback if either drop call fails.
Examples
iex> delete_stakeholder(stakeholder)
{:ok, %{stakeholder: %Stakeholder{name: "foo"}, db_user: nil, ddl_schema: nil}
iex> delete_stakeholder(stakeholder) # schema wasn't empty, wasn't deleted
{:ok, %{stakeholder: %Stakeholder{name: "foo"}, db_user: nil, ddl_schema: "foo"}
iex> delete_stakeholder(stakeholder) # role had dependent objects, wasn't deleted
{:ok, %{stakeholder: %Stakeholder{name: "foo"}, db_user: {"foo", nil}, ddl_schema: "foo"}
iex> delete_stakeholder(stakeholder)
{:error, :stakeholder, %Ecto.Changeset{}, _changes_so_far}
iex> delete_stakeholder(stakeholder)
{:error, :db_user, exception, _changes_so_far}
iex> delete_stakeholder(stakeholder)
{:error, :ddl_schema, exception, _changes_so_far}
Gets a single stakeholder.
Returns nil if the Stakeholder does not exist.
Examples
iex> get_stakeholder!(123)
%Stakeholder{}
iex> get_stakeholder!(456)
nil
Gets a single stakeholder.
Raises Ecto.NoResultsError if the Stakeholder does not exist.
Examples
iex> get_stakeholder!(123)
%Stakeholder{}
iex> get_stakeholder!(456)
** (Ecto.NoResultsError)
Initialize a stakeholder.
Examples
iex> init_stakeholder(%{name: "foo"})
%Ecto.Changeset{}
Returns the list of stakeholders.
Examples
iex> list_stakeholders()
[%Stakeholder{}, ...]
Updates a stakeholder.
This updates the stakeholder and, if necessary, renames the corresponding DDL schema and db user in the database.
As per the following note on https://www.postgresql.org/docs/current/sql-alterrole.html
Because MD5-encrypted passwords use the role name as cryptographic salt, renaming a role clears its password if the password is MD5-encrypted.
If we do rename the role, we regenerate and return a new password for the altered db user.
Examples
iex> update_stakeholder(stakeholder, %{name: "alt"})
{:ok, %{stakeholder: %Stakeholder{name: "alt"}, db_user: {"alt", new_password}, ddl_schema: "alt"}
iex> update_stakeholder(%{name: nil})
{:error, :stakeholder, %Ecto.Changeset{}, _changes_so_far}
iex> update_stakeholder(%{name: "db-user-taken"})
{:error, :db_user, exception, _changes_so_far}
iex> update_stakeholder(%{name: "ddl-schema-taken"})
{:error, :ddl_schema, exception, _changes_so_far}